Різниці у форматі Unicode, UTF, ASCII, ANSI


351

У чому різниця між Unicode, UTF8, UTF7, UTF16, UTF32, ASCII, і ANSIкодування?

Яким чином вони корисні для програмістів?


Найкращим веб-сайтом для посилань буде: msdn.microsoft.com/en-us/library/dd374081(VS.85).aspx
RamSri

6
дуже пов’язано: UTF-8 проти Unicode
Тобіас Кіенцлер


Відповіді:


470

Зниження списку:

  • " Unicode " не є кодуванням, хоча, на жаль, багато документації неточно використовує його для посилання на те, що кодує Unicode, яку використовує конкретна система за замовчуванням. У Windows та Java це часто означає UTF-16; у багатьох інших місцях це означає UTF-8. Правильно, Unicode відноситься до самого абстрактного набору символів, а не до якогось конкретного кодування.
  • UTF-16 : 2 байти на "кодову одиницю". Це власний формат рядків у .NET і, як правило, у Windows та Java. Значення поза базовою багатомовною площиною (BMP) кодуються як сурогатні пари. Вони використовувалися порівняно рідко, але тепер багатьом споживчим програмам потрібно знати про символи, що не належать до BMP, щоб підтримувати емоджи.
  • UTF-8 : Кодування змінної довжини, 1-4 байти на кодову точку. Значення ASCII кодуються як ASCII за допомогою 1 байта.
  • UTF-7 : Зазвичай використовується для кодування пошти. Швидше за все, якщо ви думаєте, що вам це потрібно, і ви не працюєте з поштою, ви помиляєтесь. (Ось тільки мій досвід людей, які публікують у групах новин тощо) - поза поштою, це взагалі не використовується широко.)
  • UTF-32 : Кодування з фіксованою шириною, використовуючи 4 байти на кодову точку. Це не дуже ефективно, але полегшує життя поза BMP. У мене є Utf32Stringклас .NET як частина моєї бібліотеки MiscUtil , якщо ви цього хочете. (Це не дуже ретельно перевірено, пам'ятайте.)
  • ASCII : Кодування однобайтових кодувань лише з використанням нижнього 7 біта. (Кодові точки Unicode 0-127.) Без наголосів тощо.
  • ANSI: Немає фіксованого кодування ANSI - їх дуже багато. Зазвичай, коли люди кажуть "ANSI", вони мають на увазі "локальну / кодову сторінку за замовчуванням для моєї системи", яку отримують за допомогою Encoding.Default , і це часто Windows-1252, але це можуть бути інші локалі.

Більше на моїй сторінці Unicode та поради щодо налагодження проблем Unicode .

Інший великий ресурс коду - unicode.org, який містить більше інформації, ніж ви коли-небудь зможете пропрацювати свій шлях - можливо, найбільш корисним бітом є діаграми коду .


6
Термін "ANSI" при застосуванні до 8-бітових кодових сторінок Microsoft є неправильним. Вони грунтувалися на проектах, поданих для стандартизації ANSI, але сам ANSI ніколи їх не стандартизував. Windows-1252 (сторінка коду, яку найчастіше називають "ANSI") схожа на ISO 8859-1 (латинська-1), за винятком того, що Windows-1252 має символи для друку в діапазоні 0x80..0x9F, де ISO 8859-1 має контрольні символи в цьому діапазоні. Unicode також має контрольні символи в цьому діапазоні. en.wikipedia.org/wiki/Windows_code_page
Кіт Томпсон

1
@ jp2code: Я б не став, але вам потрібно розрізняти "вміст, який надсилається через HTTP з веб-сервера", і "вміст, який надсилається електронною поштою". Імовірно, що електронний лист не надсилає вміст веб-сторінки - це програма, що стоїть за нею. Веб-вміст найкращий у UTF-8; вміст пошти міг би знаходитися в UTF-7, хоча я підозрюю, що добре зберегти це в UTF-8 в наші дні.
Джон Скіт

2
Для UTF-16, IMHO, я б сказав "2 байти на кодову одиницю", оскільки кодова точка поза BMP буде кодуватися сурогатними парами як 2 кодові одиниці (4 байти).
Людович Куті

1
Не вистачає відмінностей між UTF-16LE (всередині .NET) та BE, а також поняттям BOM.
Maarten Bodewes

2
@Andrew: Ні, немає (загального) маркера кодування. Windows 1252 не може представляти Unicode BOM, і це не має сенсу, оскільки це все одно лише однобайтове кодування.
Джон Скіт

68

7
Тут відповіли через 6 років після написання статті. Я прочитав це через 8 років після написання поста. 14 років потому, і це все ще добре читати. Це більше половини мого життя тому. Неймовірно.
Дейв Кнізе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.