多字节字符拆分在保存到数据库时生成垃圾符号

时间:2016-05-12 07:06:05

标签: java string split utf multibyte

在我的应用程序中,会生成动态长字符串。这些值我保存在具有最大长度的数据库中。当超过最大长度时,使用自定义代码拆分字符串,并在数据库中插入新行。

使用多字节字符时会出现此问题。如果一个单词在元音符号(matra)处被分割,那么在字符串的分割处,它会生成一个垃圾符号,如钻石,其间带有问号

    int blockSize = 12;
    String str1 = "<SOME STRING>";

    byte[] b = str1.getBytes("UTF-8");    

    int loopCount = x; // in actual code dynamically generated
    String outString = "";
    for (int i = 0; i <= loopCount; i++) {
        if (i != loopCount) {
            outString = new String(b, i * blockSize, blockSize, "UTF-8");
        } else {
            outString =
                    new String(b, i * blockSize, (b.length - loopCount * blockSize));
        }
    }
  1. 如何在单词之间避免分割字符串,而是在下一次完成单词时。 2.或者还有其他方法可以阻止生成垃圾符号。

1 个答案:

答案 0 :(得分:0)

Unicode中构思的文本在几个层面上存在问题。

纯文本由Unicode 代码点组成。 ĉ可以表示为一个代码点U + 109,以UTF-16(二进制格式)表示为一个char'\ u0109', or as c plus a zero-width so called combining diacritical mark for ^ {{1 java.text.Normalizer`可以规范化为组合或分解形式。然后在使用文本的一部分时要考虑从左到右和从右到左的标记。

UTF-16 级别,java . So splitting between code points already is problematic.,一些代码点需要2个字符,即所谓的代理项对。这在使用char的java中是可测试的。 Character类和正则表达式Character具有相当好的Unicode支持。人们可以找到类似变音符号的类别。

UTF-8 级别,某些(非ASCII)字符或代码点需要多字节序列,因此拆分字节数组会导致分裂点处出现UTF-8非法垃圾。

解决方案?

  1. 对文本进行规范化可能是明智的;心灵档案名称。
  2. 不要将字节子数组视为有效文本
  3. 小心处理字节数组的边界,即使最后Pattern可能是c,也要考虑移位边界缓冲区。