我正在解析包含字符串的文件(我不生成)。该字符串总是以2个字节开头,它告诉我后面的字符串的长度。
例如:
05 00 53 70 6F 72 74
将是:
Sport
使用C#BinaryReader,我使用:
读取字符串string s = new string(binaryReader.ReadChars(size));
有时会出现奇怪的时髦角色,这似乎会推动流的位置超出应有的位置。例如:
0D 00 63 6F 6F 6B 20 E2 80 94 20 62 6F 6F 6B
应该是:
cook - book
虽然它读得很好但是流比它应该进一步延长两个字节?! (然后会弄乱其余的解析。)
我猜它与中间的0xE2有关,但我不确定为什么或如何处理它。
任何建议都非常感谢!
答案 0 :(得分:6)
我的猜测是字符串是用UTF-8编码的。 3字节序列E2 80 94
对应于单个Unicode字符U + 2014(EM DASH)。
答案 1 :(得分:1)
在你的第一个例子中
05 00 53 70 6F 72 74
没有字节超过0x7F,这恰好是7位ASCII的限制。 UTF-8通过使用第8位来保持与ASCII的兼容性,以表明将会有更多信息。
0D 00 63 6F 6F 6B 20 E2 80 94 20 62 6F 6F 6B
就像Ted注意到你的“问题”从0xE2开始,因为那不是7位ASCII字符。
第一个字节0x0D告诉我们应该有11个字符但是有13个字节。
0xE2告诉我们,我们找到了UTF-8序列的开头,因为设置了最高位(它超过127)。在这种情况下,sequence表示 - (EM Dash)。
答案 2 :(得分:0)
正如您所说,E2字符是正确的问题。 BinaryReader.ReadChars(n)不读取n个字节,而是读取UTF-8编码的Unicode字符。请参阅维基百科Unicode Encodings。你所追求的术语是代理人物。在UTF-8中,000080 - 00009F范围内的字符由两个字节表示。这就是您的偏移不匹配的原因。
您需要使用BinaryReader.ReadBytes来修复偏移问题并将其传递给Encoding实例。
要使其工作,您需要使用BinaryReader读取字节,然后使用正确的编码对其进行解码。假设您正在处理UTF-8,那么您需要将字节数组传递给
Encoding.UTF8.GetString(byte [] rawData)
返回正确编码的字符串。
此致, Alois Kraus