【发布时间】:2013-10-19 12:03:18
【问题描述】:
我从 UTF-8 编码的流中读取了一些数据
String line = new String(byteArray, "UTF-8");
然后尝试找到一些子序列
int startPos = line.indexOf(tag) + tag.length();
int endPos = line.indexOf("/", startPos);
剪下来
String name = line.substring(startPos, endPos);
在大多数情况下它可以正常工作,但有时结果会被破坏。例如,对于像 "гордунни" 这样的输入名称,我得到了像 "горд��нни"、"горду��ни"、"г��рдунни" 等这样的值。
似乎代理对由于某种原因被随机破坏。 1000 次中我得到了 4 次。
如何解决?我是否需要使用其他 String 方法而不是 indexOf()+substring() 或对我的结果使用一些编码/解码魔法?
【问题讨论】:
-
这是linux上的问题吗?你在哪里看“断”线?我在 SWT Table 中遇到了同样的问题,但是当我在 SWT Text 或 Label 中发送此字符串时,它显示正确。最有可能是显示问题。
-
indexOf和substring方法确实适用于代码点,因此它们可能会分解代理对,但гордунни没有代理对!您确定文本一开始就被正确阅读了吗? -
如果在命令行中加上 -Dfile.encoding=UTF-8 会产生同样的结果吗?
-
这种情况很少发生的事实表明,缓冲区处理代码中的某个地方可能存在错误。您能否使用更长的字符串(可能使用 10.000 个字符)可靠地重现问题?您使用的是哪个版本的 Java?
-
@Joni 谢谢你,你是对的。问题的原因在于我的流处理代码。对于lage InputStream,我用小块读取它,并将每个数组分别转换为String。稍后我会根据需要连接字符串。因此,代理对可以被分割到不同的数组中,稍后的连接将提供这个“破碎”的字符串。如果我将整个 InputStream 转换为一个字符串,问题就会消失。仍然不知道如何用小块来做,但我发现了“断”字符串的原因。谢谢