Почему кириллические строки в шестнадцатеричном формате отличаются от кириллических символов в шестнадцатеричном формате?
str := "Э"
fmt.Printf("%x\n", str)
//result d0ad
str := 'Э'
fmt.Printf("%x\n", str)
//result 42d
🤔 А знаете ли вы, что...
Go стал популярным языком для разработки смарт-контрактов на блокчейне Ethereum.
При печати шестнадцатеричного представления string
печатается шестнадцатеричное представление его байтов, а при печати шестнадцатеричного представления rune
печатается шестнадцатеричное представление числа, для которого оно является псевдонимом (rune
является псевдонимом int32
).
А string
s в Go содержат закодированную UTF-8 последовательность байтов текста. В представлении UTF-8 символы (руны) с числовым кодом > 127 имеют многобайтовое представление.
rune
Э
имеет многобайтовое представление в UTF-8 (будучи [208, 173]
), и это не то же самое, что многобайтовое представление 32-битного целого числа 1069 = 0x42d
. Целые числа представлены с использованием дополнение до двух в памяти.
Рекомендуемая запись в блоге: Строки, байты, руны и символы в Go