Строки в кодировке ASCII и UTF8 имеют разную длину! - PullRequest
1 голос
/ 09 октября 2010

Я читаю поток и мне интересно, почему строка в кодировке 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

Ответы [ 4 ]

4 голосов
/ 09 октября 2010

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

4 голосов
/ 09 октября 2010

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

3 голосов
/ 09 октября 2010

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

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

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

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

0 голосов
/ 09 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...