Различия в формате Юникод, 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

Спускаясь вниз по вашему списку:

  • " Юникод » не является кодировкой, хотя, к сожалению, во многих документах неточно используется его для обозначения любой кодировки Юникод, используемой конкретной системой по умолчанию. В 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 бит. (Юникод кодовые точки 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 (Latin-1), за исключением того, что Windows-1252 имеет печатаемые символы в диапазоне 0x80..0x9F, где ISO 8859-1 имеет контрольные символы в этом диапазоне. Юникод также имеет управляющие символы в этом диапазоне. ru.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, а также понятие спецификации.
Maarten Bodewes
2
@ Андрей: Нет, нет (общего) маркера кодирования. Windows 1252 не может представлять спецификацию Unicode, и это не имеет смысла, так как в любом случае это всего лишь кодирование по одному байту на символ.
Джон Скит
68

Некоторое чтение, чтобы вы начали работать с кодировкой символов: Джоэл о программном обеспечении: Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!)

Кстати - ASP.NET тут не причем. Кодировки универсальны.

Томалак
источник
7
Ответили здесь через 6 лет после написания статьи. Я прочитал это через 8 лет после того, как пост был написан. 14 лет спустя, и это все еще хорошее чтение. Это больше половины моей жизни назад. Невероятный.
Дэйв Книс