Кодирование смайликов в Эрланге
Предполагая, что у меня есть двоичный файл
Message = <<"string containing emoji">>.
Как мне правильно закодировать его в Unicode? Я пытался сделать:
Encoded = <<Message/utf16>>.
Я получаю это предупреждение при компиляции файла:
Предупреждение: двоичная конструкция завершится с ошибкой "badarg" (недопустимая кодовая точка Unicode в сегменте utf8/utf16/utf32)
Я пробовал это также с /utf8. То же предупреждение.
2 ответа
Предполагая, что двоичный файл, с которого вы начинаете, кодируется в соответствии с UTF-8, и вам нужно кодировать его как UTF-16 с прямым порядком байтов, это должно работать:
unicode:characters_to_binary(<<"string containing emoji">>, utf8, {utf16, little})
См. Документацию для модуля Unicode для получения дополнительной информации.
Причина по которой <<Message/utf16>>
не в том, что utf8
, utf16
а также utf32
Спецификаторы в битовом синтаксисе кодируют одну кодовую точку, а не всю строку. Таким образом, чтобы закодировать символ U+1F64C
, вы можете использовать:
2> <<16#1f64c/utf8>>.
<<240,159,153,140>>
3> <<16#1f64c/utf16>>.
<<"\330=\336L">>
4> <<16#1f64c/utf32>>.
<<0,1,246,76>>
Вам может понадобиться добавить -*- coding: utf8 -*-
в качестве первой строки вашего модуля и используйте /utf8.
Я предполагаю, что вы используете Erlang/OTP < 17, то есть файлы считаются латинскими-1, если не указано иное.