UTF-8: Unicode TransformationFormat-8bit, спецификация разрешена, но спецификация обычно не включается. Это многобайтовая кодировка, используемая для распознавания международных символов. Она использует 8 бит (то есть один байт) для английского языка и 24 бита (три байта) для китайского языка. UTF-8 содержит символы, которые используются во всех странах мира. Это международная кодировка, обладающая высокой универсальностью. Текст в кодировке UTF-8 может отображаться в браузерах разных стран, поддерживающих набор символов UTF8. Например, если это кодировка UTF8, китайский язык также может отображаться в английском IE иностранцев, и им не нужно загружать пакет поддержки китайского языка IE.
GBK — это стандарт, основанный на национальном стандарте GB2312 и расширенный для совместимости с GB2312. Текстовая кодировка GBK представлена двойными байтами, то есть как китайские, так и английские символы представлены двойными байтами. Чтобы различать китайские символы, старшие биты устанавливаются в 1. GBK содержит все китайские символы и является национальной кодировкой. Она менее универсальна, чем UTF8, но UTF8 занимает большую базу данных, чем GBD.
GBK, GB2312 и т. д. необходимо преобразовать в UTF8 посредством кодировки Unicode:
ГБК, GB2312--Юникод--UTF8
UTF8--Юникод--GBK, GB2312
Для веб-сайта или форума, если на нем много английских символов, для экономии места рекомендуется использовать UTF-8. Однако многие плагины форумов теперь обычно поддерживают только GBK.
Подробное объяснение разницы между кодировками. Проще говоря, коды unicode, gbk и «большая пятерка» — это закодированные значения, а utf-8, uft-16 и подобные — выражения этого значения. Предыдущие три кода совместимы. Для одного и того же китайского иероглифа три значения кода совершенно разные. Например, значение uncode «Han» отличается от gbk. Предположим, что uncode — a040, а gbk — b030, а код uft-8 — это форма, в которой выражается это значение. Код utf-8 полностью организован только для uncode. Если GBK хочет преобразовать в UTF-8, его необходимо сначала преобразовать в uncode, а затем преобразовать в utf-8, и все в порядке.
Подробности см. в перепечатанной ниже статье.
Давайте поговорим о кодировке Unicode и кратко объясним такие термины, как UCS, UTF, BMP и BOM. Это интересное чтение, написанное программистами для программистов. Так называемое развлечение означает, что вы можете легко понять некоторые ранее неясные понятия и улучшить свои знания, что похоже на прокачку в ролевой игре. Поводом к организации этой статьи являются два вопроса:
Вопрос первый:
Используя «Сохранить как» в Блокноте Windows, вы можете конвертировать методы кодирования GBK, Unicode, Unicode с прямым порядком байтов и UTF-8. Или вы можете перейти непосредственно на http://www.knowsky.com/tools/utf8.asp для онлайн-конвертации.
Это также текстовый файл. Как Windows определяет метод кодирования?
Я давно обнаружил, что текстовые файлы в кодировке Unicode, Unicode bigendian и UTF-8 будут иметь в начале еще несколько байтов: FF, FE (Unicode), FE, FF (biendian Unicode), EF, BB, BF. (UTF-8). Но на каких критериях основаны эти маркеры?
Вопрос второй:
Недавно я увидел в Интернете ConvertUTF.c, который реализует взаимное преобразование UTF-32, UTF-16 и UTF-8. Я уже знаю о таких методах кодирования, как Unicode (UCS2), GBK и UTF-8. Но эта программа меня немного смущает, и я не могу вспомнить, какова связь между UTF-16 и UCS2.
Проверив соответствующую информацию, я наконец прояснил эти вопросы, а также узнал некоторые подробности о Unicode. Напишите статью и отправьте ее друзьям, у которых есть похожие вопросы. Эта статья написана максимально простой для понимания, но читатели обязаны знать, что такое байты и что такое шестнадцатеричные числа.
0. с прямым порядком байтов и прямым порядком байтов
с прямым порядком байтов и с прямым порядком байтов — это разные способы обработки многобайтовых чисел процессором. Например, кодировка символа «汉» в Юникоде — 6C49. Итак, при записи в файл следует писать впереди 6C или 49? Если впереди написано 6C, то это обратный порядок байтов. Если впереди написано 49, то это прямой порядок байтов.
Слово «эндиан» пришло из «Путешествий Гулливера». Гражданская война в Лилипутии была вызвана тем, кто разбил яйца: от Big-Endian или Little-Endian. В результате произошло шесть восстаний: один император погиб, а другой потерял трон.
Обычно мы переводим порядок байтов как «порядок байтов», а прямой и прямой порядок байтов называются «большим концом» и «младшим концом».
1. Кодировка символов и внутренний код. Кстати, символы китайской кодировки должны быть закодированы, прежде чем они смогут быть обработаны компьютером. Методом кодирования по умолчанию, используемым компьютером, является внутренний код компьютера. Ранние компьютеры использовали 7-битную кодировку ASCII. Для обработки китайских символов программисты разработали GB2312 для упрощенного китайского языка и big5 для традиционного китайского языка.
В документах IETF RFC2781 и RFC3629 методы кодирования UTF-16 и UTF-8 четко, ясно и строго описаны в едином стиле RFC. Я всегда забываю, что IETF — это аббревиатура Internet Engineering Task Force. Однако RFC, поддерживаемый IETF, является основой для всех спецификаций в Интернете.
2.1. Внутренний код и кодовая страница.
В настоящее время ядро Windows уже поддерживает набор символов Unicode, поэтому ядро может поддерживать все языки мира. Однако, поскольку большое количество существующих программ и документов используют определенную языковую кодировку, например GBK, Windows не может не поддерживать существующую кодировку и все они используют Unicode.
Windows использует кодовые страницы для адаптации к различным странам и регионам. Под кодовой страницей можно понимать внутренний код, упомянутый ранее. Кодовая страница, соответствующая GBK, — CP936.
Microsoft также определяет кодовую страницу для GB18030: CP54936. Однако, поскольку GB18030 имеет некоторые 4-байтовые кодировки, а кодовая страница Windows поддерживает только однобайтовые и двухбайтовые кодировки, эту кодовую страницу невозможно использовать.
3. УКС-2, УКС-4, БМП
UCS поставляется в двух форматах: UCS-2 и UCS-4. Как следует из названия, UCS-2 кодируется двумя байтами, а UCS-4 — 4 байтами (фактически используется только 31 бит, старший бит должен быть равен 0). Давайте поиграем в простые математические игры:
UCS-2 имеет 2^16=65536 кодовых точек, а UCS-4 имеет 2^31=2147483648 кодовых точек.
UCS-4 разделен на 2^7=128 групп в соответствии со старшим байтом, причем старший бит равен 0. Каждая группа разделена на 256 плоскостей в зависимости от следующего старшего байта. Каждая плоскость разделена на 256 строк по третьему байту, каждая строка содержит 256 ячеек. Разумеется, ячейки в одной строке отличаются только последним байтом, а остальные одинаковы.
Плоскость 0 группы 0 называется базовой многоязычной плоскостью или BMP. Или в UCS-4 биты кода, у которых два старших байта равны 0, называются BMP.
UCS-2 получается путем удаления первых двух нулевых байтов BMP UCS-4. Добавьте два нулевых байта перед двумя байтами UCS-2, чтобы получить BMP UCS-4. В текущей спецификации UCS-4 нет символов, выделенных за пределами BMP.
4. Кодировка UTF
UTF-8 кодирует UCS в 8-битных единицах. Кодировка UCS-2 в UTF-8 выглядит следующим образом:
Кодировка UCS-2 (шестнадцатеричная) Поток байтов UTF-8 (двоичный)
0000-007F 0xxxxxxx
0080-07FF 110xxxxxx 10xxxxxx
0800 – FFFF 1110xxxx 10xxxxxx 10xxxxxx
Например, кодировка «Китайский» в Юникоде — 6C49. 6C49 находится между 0800-FFFF, поэтому необходимо использовать 3-байтовый шаблон: 1110xxxx 10xxxxxx10xxxxxx. Запись 6C49 в двоичном формате: 0110 110001 001001. Используя этот битовый поток для замены x в шаблоне по очереди, мы получаем: 1110011010110001 10001001, что равно E6 B1 89.
Читатели могут использовать Блокнот, чтобы проверить правильность нашего кода. Следует отметить, что UltraEdit автоматически преобразуется в UTF-16 при открытии текстового файла в кодировке UTF-8, что может вызвать путаницу. Вы можете отключить эту опцию в настройках. Лучшим инструментом является Hex Workshop.
UTF-16 кодирует UCS в 16-битных единицах. Для кодов UCS меньше 0x10000 кодировка UTF-16 равна 16-битному целому числу без знака, соответствующему коду UCS. Для кодов UCS не менее 0x10000 определен алгоритм. Однако, поскольку BMP фактически используемых UCS2 или UCS4 должен быть меньше 0x10000, на данный момент можно считать, что UTF-16 и UCS-2 по сути одинаковы. Однако UCS-2 — это всего лишь схема кодирования, а UTF-16 используется для фактической передачи, поэтому необходимо учитывать вопрос порядка байтов.
5. Порядок байтов UTF и спецификация
UTF-8 использует байты в качестве единицы кодирования и не имеет проблем с порядком байтов. UTF-16 использует два байта в качестве единицы кодирования. Прежде чем интерпретировать текст UTF-16, вы должны сначала понять порядок байтов каждой единицы кодирования. Например, кодировка Unicode для «Kui» — 594E, а кодировка Unicode для «B» — 4E59. Если мы получим поток байтов UTF-16 «594E», это «Ку» или «Б»?
Рекомендуемый метод обозначения порядка байтов в спецификации Unicode — это спецификация. Спецификация — это не список спецификаций «Спецификации», а метка порядка байтов. Спецификация — это немного умная идея:
В кодировке UCS есть символ «ZERO WIDTH NO-BREAKSPACE», и его кодировка — FEFF. FFFE — это символ, которого нет в UCS, поэтому он не должен появляться в реальной передаче. Спецификация UCS рекомендует передавать символы «НУЛЕВАЯ ШИРИНА БЕЗ РАЗРЫВОВ» перед передачей потока байтов.
Таким образом, если получатель получает FEFF, это указывает на то, что поток байтов имеет обратный порядок байтов; если он получает FFFE, это указывает на то, что поток байтов имеет прямой порядок байтов; Поэтому символ «НУЛЕВАЯ ШИРИНА БЕЗ РАЗРЫВОВ» также называется спецификацией.
UTF-8 не требует спецификации для указания порядка байтов, но может использовать спецификацию для указания метода кодирования. Кодировка UTF-8 символа «ZERO WIDTH NO-BREAKSPACE» — EF BB BF (читатели могут проверить это, используя метод кодировки, который мы представили ранее). Таким образом, если получатель получает поток байтов, начинающийся с EF BBBF, он знает, что он закодирован UTF-8.
Windows использует спецификацию для обозначения кодировки текстовых файлов.
6. Дополнительные справочные материалы Основным справочным материалом для этой статьи является «Краткий обзор ISO-IEC 10646 и Unicode» ( http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html ).
Я также нашел две части информации, которые выглядели хорошо, но, поскольку у меня уже были ответы на мои первоначальные вопросы, я не стал их читать:
«Понимание Unicode. Общее введение в стандарт Unicode» ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a )
«Основы кодирования набора символов. Понимание кодировок набора символов и устаревших кодировок» ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03 )
Я написал пакеты программного обеспечения для преобразования UTF-8, UCS-2 и GBK друг в друга, включая версии, использующие Windows API, и версии, которые не используют Windows API. Если у меня будет время в будущем, я разберу это и выложу на своей личной домашней странице ( http://fmddlmyy.home4u.china.com ).
Я начал писать эту статью, обдумав все вопросы, и думал, что смогу закончить ее через некоторое время. Неожиданно для обдумывания формулировки и проверки деталей потребовалось много времени, и я писал ее с 1:30 до 9:00 дня. Надеюсь, что некоторые читатели смогут извлечь из этого пользу.
Приложение 1. Давайте поговорим о коде местоположения, GB2312, внутреннем коде и кодовой странице. У некоторых друзей все еще есть вопросы по этому предложению в статье:
«Исходный текст GB2312 по-прежнему является кодом города. От кода города до внутреннего кода вам необходимо добавить A0 к старшему и младшему байту соответственно».
Позвольте мне объяснить это подробно:
«Исходный текст GB2312» относится к национальному стандарту 1980 года «Базовый набор наборов китайских кодированных символов для национального стандартного обмена информацией Китайской Народной Республики GB2312-80». Этот стандарт использует два числа для кодирования китайских иероглифов и китайских символов. Первое число называется «площадью», а второе число — «битом». Поэтому его еще называют кодом местоположения. Области 1–9 — это китайские символы, области 16–55 — китайские иероглифы первого уровня, а области 56–87 — китайские иероглифы второго уровня. Теперь в Windows также есть метод ввода местоположения, например, введите 1601, чтобы получить «ах». (Этот метод ввода местоположения может автоматически распознавать шестнадцатеричный код местоположения GB2312 и десятичный коды местоположения, что означает, что при вводе B0A1 также будет получено «ах».)
Внутренний код — это кодировка символов в операционной системе. Внутренний код ранних операционных систем зависел от языка. Сегодняшняя Windows поддерживает Unicode внутри системы, а затем использует кодовые страницы для адаптации к различным языкам. Понятие «внутренний код» является относительно расплывчатым. Microsoft обычно называет кодировку, указанную кодовой страницей по умолчанию, внутренним кодом.
Официального определения термина «внутренний код» не существует, а кодовая страница — это всего лишь название компании Microsoft. Как программистам, пока мы знаем, что это такое, нет необходимости слишком подробно изучать эти термины.
Так называемая кодовая страница (кодовая страница) — это кодировка символов языка. Например, кодовая страница GBK — CP936, кодовая страница BIG5 — CP950, а кодовая страница GB2312 — CP20936.
В Windows существует концепция кодовой страницы по умолчанию, то есть какая кодировка используется по умолчанию для интерпретации символов. Например, Блокнот Windows открывает текстовый файл, а содержимое внутри представляет собой поток байтов: BA, BA, D7, D6. Как Windows должна это интерпретировать?
Следует ли интерпретировать его в соответствии с кодировкой Unicode, GBK, BIG5 или ISO8859-1? Если интерпретировать по ГБК, то получится слово «китайские иероглифы». Согласно другим интерпретациям кодирования, соответствующий символ может не быть найден или может быть найден неправильный символ. Так называемая «ошибка» означает, что она не соответствует первоначальному замыслу автора текста, и символы получаются искаженными.
Ответ заключается в том, что Windows интерпретирует поток байтов в текстовом файле в соответствии с текущей кодовой страницей по умолчанию. Кодовую страницу по умолчанию можно установить с помощью региональных параметров на панели управления. В блокноте «Сохранить как» есть элемент ANSI, который фактически сохраняется в соответствии с методом кодировки кодовой страницы по умолчанию.
Внутренним кодом Windows является Unicode, который технически может поддерживать несколько кодовых страниц одновременно. Если файл может объяснить, какую кодировку он использует, и пользователь установил соответствующую кодовую страницу, Windows может отображать ее правильно. Например, в файле HTML можно указать кодировку.
Некоторые авторы HTML-файлов, особенно англоязычные, считают, что все в мире используют английский язык, и не указывают кодировку в файле. Если он использует символы в диапазоне 0x80-0xff, а китайская Windows интерпретирует их в соответствии с GBK по умолчанию, символы будут отображаться искаженно. На данный момент просто добавьте оператор, определяющий кодировку, в html-файл, например:
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
Если кодовая страница, использованная первоначальным автором, совместима с ISO8859-1, искаженных символов не будет.
Давайте поговорим о коде местоположения. Код местоположения Ах — 1601, что означает 0x10, 0x01 в шестнадцатеричном формате. Это противоречит кодировке ASCII, широко используемой компьютерами. Чтобы обеспечить совместимость с кодировкой ASCII 00–7f, мы добавляем A0 к старшему и младшему байтам кода города соответственно. Таким образом, код «ах» станет B0A1. Мы также называем кодировку с двумя добавленными A0 кодировкой GB2312, хотя в исходном тексте GB2312 об этом вообще не упоминается.