Как конвертировать фактический Unicode в \ u0123 - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу превратить текст Unicode в чистую кодировку ASCII с использованием escape-последовательностей.

Ввод: Ɏɇ衳 вывод в ... "\u024E\u0247\u8873"

В основном напротив этого.

$ echo -e "\u024E\u0247\u8873"
Ɏɇ衳

Я хочу, чтобы кодировка оставалась в utf8, все, что я делаю, это меняю формы.

Я пробовал:

iconv -f utf8 -t utf8  $file
iconv -f utf8 -t utf16  $file

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

упомянутые вами коды 024E, 0247, .. называются кодовые точки Unicode и не зависят от UTF-8 или UTF-16.
Если perl является вашим вариантом, вы можете получить коды с помощью:

perl -C -ne 'map {printf "\\u%04X", ord} (/./g)' <<< "Ɏɇ衳"; echo

который выводит:

\u024E\u0247\u8873

Объяснение

Код Perl выше в основном эквивалентен:

#!/usr/bin/perl

use utf8;

$str = "Ɏɇ衳";
foreach $chr ($str =~ /./g) {
    printf "\\u%04X", ord($chr);
}
print "\n";
  • use utf8 указывает, что строка закодирована в UTF-8 (только потому, что строка встроена в скрипт).
  • ($str =~ /./g) разбивает строку на массив символов.
  • foreach перебирает массив символов.
  • ord возвращает кодовую точку данного символа.

EDIT

Если вы хотите автоматически масштабировать количество цифр с учетом символов вне BMP, попробуйте вместо этого:

#!/usr/bin/perl

use utf8;

$str = "Ɏɇ衳";
foreach $chr ($str =~ /./g) {
    $n = ord($chr);
    $d = $n > 0xffff ? 8 : 4;
    printf "\\u%0${d}X", $n;
}
0 голосов
/ 16 ноября 2018

Если у вас есть это в файле, вы можете использовать iconv.

iconv -f $input_encoding -t $output_encoding $file

проверьте "man iconv" для более подробной информации

...