数据库使用的是UTF-8编码,字段定义为varchar2(512)
当向该字段插入170多个汉字时,数据库报'插入超长'
Google到时因为java内用的是unicode码,转换为表中的UTF-8后的字节数发生改变。
请问各位有什么高招能取得unicode字符转换为UTF-8后的字节数,这样好判断插入表中的字符串是否超长?

解决方案 »

  1.   

    170*3 = 510汉字每个占用3个字节OVER
      

  2.   

    现在情况变得复杂了,字符串中包含中日英三种字符,如果超长的话,就对字符串进行截取,且截取后的字符串不能有乱码。    private String interceptKeyWord(String keyword, int maxLength,
            String delimiter) {
            String subStr;        try {
                // unicode转码为utf8
                byte[] keywordCodes = keyword.getBytes("utf8");
                // utf8转码为unicode
                subStr = new String(keywordCodes, 0, maxLength - 1, "utf8");            if (subStr.lastIndexOf(delimiter) < 0) {
                    // 原字符串中不包含分隔符
                    return subStr;
                } else {
                    return subStr.substring(0,
                        subStr.lastIndexOf(delimiter, maxLength));
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    程序的逻辑:关键字字符串以逗号作为分隔符隔开,如果字符串超长则截取到第一个小于最大长度的逗号处。
    但是在第一个关键字就超长的情况下,这种那个截取很有可能会得到乱码?请问一楼,这种情况要怎么处理呢??
      

  3.   

    汉字占3个字符,一个字符等于两个字节,所以java到oracle一个汉字等于6个字节,普通的varchar2类型最多能导入666个java汉字。当然你通过plsql导入能到2000个。
      

  4.   

    现在把问题描述如下:
    给定一个包含utf8格式的中日英字符的字符串和一个指定的最大字节数
    现要对字符串进行截取,截取后的得到的字符串的字节数最接近指定的最大字节数
    且在截取后的字符串中没有乱码
    请问这个需要怎么设计呢??
      

  5.   

    针对昨天提出的问题,google得到utf8到编码规则:
    1字节:0xxxxxxx
    2字节:110xxxxx 10xxxxxx
    3字节:1110xxxx 10xxxxxx 10xxxxxx
    4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    5字节:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    6字节:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    根据这个规则,我写了个对所有utf8字符串进行截取,且不得到乱码的方法: /**
     * 对UTF8编码的字符串按字节数进行截取,且保证截取后的字符串中没有乱码
     * @param src 原字符串
     * @param maxLength 截取的最大字节数
     * @return
     */
    public static String intercept(String src,int maxLength) {
    String result = null;
    try {
    byte[] srcBytes = src.getBytes("utf8");
    //从截取后的最后一个字节进行判断
                            int index = maxLength;
                            //第一个0的位置为2,说明该字节为一个字符编码的一部分
    while(getFirstZeroPosition(srcBytes[--index])==2);
    result = new String(srcBytes,0,index,"utf8");
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    return result;
    }
    /**
     * 查找字节中第一个0的位置(从左往右)
     * @param src 
     * @return
     */
    public static byte getFirstZeroPosition(byte src) {
    byte index = 0;
    while(((src<<index++)&0x80)!=0); 
    return index;
    }不管原字符串中包含什么字符,只要是UTF8编码的就都可进行按字节截取,且不会得到乱码!
    当然,程序只是初步实现功能!
      

  6.   

    建议用clob顶替,或者在程序中确切控制插入的字符串长度