Silverlight UTF8编码器产生古怪的输出

时间:2010-10-14 00:53:58

标签: vb.net silverlight utf-8

我一直试图追踪一个小时数小时,现在已经归结为:

Dim length as Integer = 300
Dim buffer() As Byte = binaryReader.ReadBytes(length)
Dim text As String = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length)

问题是缓冲区包含300个字节,但字符串'text'的长度现在是285.当我将其转换回字节时,长度为521个字节... WTF?

相同的代码是一个正常的WinForms应用程序完美的工作。二进制阅读器读取的数据是UTF8编码的字符串。有什么想法为什么Silverlight会扮演有趣的玩家?

1 个答案:

答案 0 :(得分:0)

我敢打赌你的流包含一些需要多个字节的字符。 UTF8尽可能使用单个字节,但当字符超出ASCII范围时使用更多字节。

这解释了为什么你的缓冲区长于字符串(300 vs 285)。

示例

string: "t      e      s      t      ä        " (length = 5 -last char takes 2 bytes)
bytes:   0x74 | 0x65 | 0x73 | 0x74 | 0xc3 0xa4  (length = 6)

至于为什么当你将文本转换回字节时它变得更长,我最好的猜测(也看你得到的521大小)是你使用Encoding.Unicode而不是Encoding.UTF8来执行转换。 Unicode总是为每个字符使用两个字节。

(顺便说一句。显然这与Silverlight无关。你可能在Winforms vs. Silverlight中用两个不同的字符串测试代码。不用担心,我们都做了类似的愚蠢错误:-))