преобразование utf-16 в utf-8, связанные с знанием и кратким описанием реализации golang

Go

преобразовать кодировку golang utf-16le в utf-8

В настоящее время я работаю над разбором данных гонконгских акций, сервис OMD-MMDH, предоставляемый Гонконгской фондовой биржей, отправляет данные в виде потоков байтов, в которых китайские символы закодированы в utf16, а программа golang закодирована в utf8 по умолчанию, поэтому необходимо выполнить преобразование, поэтому сделайте учебные заметки о знаниях, связанных с Unicode, и методе golang для преобразования utf16 в utf8

Введение в спецификацию

BOM(Byte Order Mark)И знак порядка следования байтов, который обычно появляется в заголовке файла в кодировке Unicode. При просмотре файла в кодировке Unicode со спецификацией в его двоичной кодировке отображаются следующие данные: Ниже приведены лишь некоторые часто используемые кодировки символов.

Кодировка символов Бом (шестнадцатеричный)
UTF-8 EF BB BF
UTF-16 (BE) большой Endian FE FF
UTF-16 (LE) с прямым порядком байтов FF FE
UTF-32 (BE) с обратным порядком байтов 00 00 FE FF
UTF-32 (LE) с прямым порядком байтов FF FE 00 00
GB-18030 84 31 95 33

Введение в кодировку Unicode

  • UnicodeЭто международный стандарт кодирования, который вмещает все текстовые символы в мире, используя четыре байта для кодирования каждого символа.

  • UTFЭто аббревиатура английского формата преобразования Unicode, что означает преобразование символов Unicode в определенный формат. Схемы кодирования серии UTF (UTF-8, UTF-16, UTF-32) являются производными от схемы кодирования Unicode для адаптации к различному хранению или передаче данных, и они могут полностью представлять все символы стандарта Unicode. В настоящее время среди этих вариантов широко используется UTF-8, тогда как UTF-16 и UTF-32 используются редко.

  • UTF-8Используйте от одного до четырех байтов для кодирования каждого символа, большинство китайских символов кодируются тремя байтами, а небольшое количество необычных китайских символов кодируется четырьмя байтами. Поскольку UTF-8 является методом кодирования с переменной длиной, он может уменьшить объем памяти, занимаемый кодировкой Unicode, поэтому он широко используется.

  • UTF-16Используйте два или четыре байта для кодирования каждого символа, большинство из которых используют двухбайтовую кодировку для китайских символов и четырехбайтовую кодировку для небольшого количества необычных китайских символов. Кодировка UTF-16 имеет прямой и прямой порядок байтов, а именно UTF-16BE и UTF-16LE, U+FEFF или U+FFFE будут помещены перед кодировкой (UTF-16BE представлен FEFF, UTF-16LE представлен представлением FFFE). ), где символ U+FEFF в Unicode означает НУЛЕВОЙ ШИРИНЫ НЕРАЗРЫВНЫЙ ПРОБЕЛ, как следует из названия, это пробел без ширины и переноса.

  • UTF-32Использование четырех байтов для каждой кодировки символов делает UTF-32 обычно в два-четыре раза больше, чем другие кодировки. Как и UTF-16, UTF-32 имеет прямой и прямой порядок байтов, и U+0000FEFF или U+0000FFFE будут помещены перед кодировкой для различения.

прямой и прямой порядок байтов

  • Big-endian: Big-endian означает, что младшие адреса в памяти хранят старшие биты соответствующего целого числа.
  • Little-endian: Little-endian — это младший адрес в памяти, в котором хранятся младшие биты соответствующего целого числа.
字节数组:[0 1 2]

按照大端序转换成二进制为:
0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 1 0

按照小端序转换成二进制为:
0 0 0 0 0 0 1 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0

所以字节数组[0 1 2]大端序十进制为:258,小端序为:131328

Справочник по реализации преобразования в golangbinaryСумка

golang конвертирует кодировку utf-16 в utf-8

utf-16 не может игнорировать разницу между прямым порядком байтов и прямым порядком байтов кодировки при преобразовании, иначе это приведет к искажению символов, и преобразование будет использовать пакетgolang.org/x/text/encoding/unicode,

bs := [8]byte{93, 78, 95, 134, 75, 144, 26, 144}
decoder := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder()
bs2, err := decoder.Bytes(bs[:])
fmt.Println(string(bs2), err)

output...

九號運通 <nil>

unicode.LittleEndianуказан как прямой порядок байтов

unicode.IgnoreBOMИгнорировать бирки

Ссылка на ссылку: