преобразовать кодировку 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
Игнорировать бирки
Ссылка на ссылку: