2010-10-08 3 views
1

Я читаю поток и задаюсь вопросом, почему закодированная строка UTF-8 короче, чем ASCII.Строки, закодированные в ASCII и UTF8, имеют разную длину!

ASCIIEncoding encoder = new ASCIIEncoding(); 
    UTF8Encoding enc = new UTF8Encoding(); 
    string response = encoder.GetString(message, 0, bytesRead); //4096 
    string responseUtf8 = enc.GetString(message, 0, bytesRead); //3955 

ответ

3

Это потому, что поток фактически кодируется UTF-8. Если он был кодирован ASCII, строки были бы идентичны.

При чтении как ASCII комбинации байтов, которые представляют символы вне набора 0-127, будут считаться отдельными символами, и они будут выглядеть как мусор.

При чтении как UTF-8 комбинации байтов будут декодированы в правильные символы, каждая многобайтовая комбинация заканчивается как один символ.

(Примечание: Строки не кодируются, это поток, который кодируется Вы декодировать поток из ASCII или UTF-8 в строку символов Unicode.).

-1

Возможно, сообщение содержит некоторые символы, которые не могут быть закодированы в виде одного байта в UTF-8.

4

UTF-8 обрабатывает разные строки, чем ASCII: на UTF-8 каждый символ может иметь длину 1, 2 или 3 байта. Однако ASCII рассматривает каждый байт как символ. Кодер C# UTF-8 подсчитывает хорошо сформированные символы UTF-8 вместо байтов. Я надеюсь, это поможет вам.

+0

Я думаю, что это правильно. Обратите внимание, что 'ASCIIEncoding' не имеет обнаружения ошибок, но' UTF8Encoding' делает. –

+0

А? Обнаружение ошибок? Какие? – Timwi

+1

Как отмечено в документах, ['ASCIIEncoding'] (http://msdn.microsoft.com/en-us/library/system.text.asciiencoding.asciiencoding.aspx) не обнаружено ошибок. Поэтому он будет счастливо «декодировать» байты, которые не имеют никакого смысла как ASCII в вопросительных знаках. –

4

Поскольку при декодировании байт, ASCIIEncoding заменяет все байты больше, чем 127 (0x7F) с знаком вопроса (?), который является один символом, в то время как UTF8Encoding декодирует UTF-8 многобайтовых последовательности правильно в отдельные символы (например, три байта 232,170,158 становятся единственным символом 語).

Смежные вопросы