我正在阅读一个流,我想知道为什么UTF-8编码的字符串比ASCII字符串短。
ASCIIEncoding encoder = new ASCIIEncoding();
UTF8Encoding enc = new UTF8Encoding();
string response = encoder.GetString(message, 0, bytesRead); //4096
string responseUtf8 = enc.GetString(message, 0, bytesRead); //3955
答案 0 :(得分:4)
UTF-8处理的字符串与ASCII不同:在UTF-8上,每个字符的长度可以是1,2或3个字节。但是,ASCII将每个字节视为一个字符。 C#UTF-8编码器计算格式良好的UTF-8字符,而不是字节。我希望这会对你有所帮助。
答案 1 :(得分:4)
因为在解码字节时,ASCIIEncoding
用一个问号(?
)替换所有大于127(0x7F)的字节,而UTF8Encoding
解码UTF-8多个字节序列正确地成为单个字符(例如,三个字节232,170,158成为单个字符语)。
答案 2 :(得分:3)
那是因为流实际上是UTF-8编码的。如果是ASCII编码,字符串将是相同的。
当读取为ASCII时,表示0-127代码集之外的字符的字节组合将被读取为单独的字符,它们看起来像垃圾。
当读为UTF-8时,字节组合将被解码为正确的字符,每个多字节组合最终为单个字符。
(注意:字符串不是编码的,而是编码的流。您将ASCII或UTF-8的流解码为Unicode字符串。)
答案 3 :(得分:-1)
也许该消息包含一些无法在UTF-8中编码为单个字节的字符。