我用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()或在我的结果上使用某些编码/解码魔法?
答案 0 :(得分:0)
在您的示例中,您可以显示byteArray,行和标记的内容吗?你还能说明将获得什么样的长度,什么是startPos以及什么是endPos?我的意思是,在字符串“гордунни”中没有“/”!为什么要计算endPos?标签内的字符串是什么?你确定substring的第二个参数是endpos而不是长度吗?确实,“гордунни”不需要代理对,因为所有代码点都低于0xFFFF,但是在你的utf-16字符串的某个地方至少有一个代理对,我敢打赌字符串的长度会给你字数元素而不是代码点的数量。我不确定Java,但在C#length中给出了元素的数量。要获得字符/代码点的数量,您必须在C#中使用StringInfo类。还要检查字符串中是否有一些BOM。什么是
String line = new String(byteArray,“UTF-8”);
在做什么?字节数组是否是utf-8编码的字符串转换为utf-16?它是否包含utf-8 BOM?之后的字符串是否有utf-16LE或utf-16BE BOM?
答案 1 :(得分:0)
为了解决“未答复”问题。队列中。
出现此问题是因为流被读取为字节块,有时会拆分多字节UTF-8字符。
通过将InputStream包装在InputStreamReader中,您将读取字符块(而不是字节块),并且多字节UTF-8字符将存活。