Программа для проверки / поиска символов UTF-8/Unicode в строке в командной строке?
Я только что понял, что у меня есть файл в моей системе; обычно перечисляет:
$ ls -la TΕSТER.txt
-rw-r--r-- 1 user user 8 2013-04-11 18:07 TΕSТER.txt
$ cat TΕSТER.txt
testing
... все же, он вылетает с программным обеспечением с ошибкой, связанной с UTF-8/Unicode. Я был действительно озадачен, так как я не мог сказать, почему такой файл является проблемой; и наконец я вспомнил, чтобы проверить вывод ls
с hexdump
:
$ ls TΕSТER.txt
TΕSТER.txt
$ ls TΕSТER.txt | hexdump -C
00000000 54 ce 95 53 d0 a2 45 52 2e 74 78 74 0a |T..S..ER.txt.|
0000000d
... Ну, очевидно, есть несколько байтов между / вместо некоторых букв, так что я думаю, что это проблема кодировки Unicode. И я могу попытаться отослать байты назад, чтобы увидеть, что напечатано:
$ echo -e "\x54\xCE\x95\x53\xD0\xA2\x45\x52\x2E\x74\x78\x74"
TΕSТER.txt
... но я до сих пор не могу сказать, какие - если они есть - символы Юникода это.
Так есть ли инструмент командной строки, с помощью которого я могу проверить строку на терминале и получить Unicode информацию о ее символах?
3 ответа
Попробуйте использовать uniname, часть пакета uniutils в системах Debian и Ubuntu. Вот пример неимения в действии:
echo -e "\x54\xCE\x95\x53\xD0\xA2\x45\x52\x2E\x74\x78\x74" | uniname
No LINES variable in environment so unable to determine lines per page.
Using default of 24.
character byte UTF-32 encoded as glyph name
0 0 000054 54 T LATIN CAPITAL LETTER T
1 1 000395 CE 95 Ε GREEK CAPITAL LETTER EPSILON
2 3 000053 53 S LATIN CAPITAL LETTER S
3 4 000422 D0 A2 Т CYRILLIC CAPITAL LETTER TE
4 6 000045 45 E LATIN CAPITAL LETTER E
5 7 000052 52 R LATIN CAPITAL LETTER R
6 8 00002E 2E . FULL STOP
7 9 000074 74 t LATIN SMALL LETTER T
8 10 000078 78 x LATIN SMALL LETTER X
9 11 000074 74 t LATIN SMALL LETTER T
10 12 00000A 0A LINE FEED (LF)
Ну, я посмотрел немного в сети, и нашел один вкладыш ugrep
в Поиск юникод по имени | commandlinefu.com; но это не очень мне помогает здесь.
Затем я увидел кодеки - Строковое кодирование и декодирование - Python Module of the Week, у которого есть много опций - но мало связанных с именами символов Unicode.
Итак, наконец, я закодировал небольшой инструмент utfinfo.pl
, который принимает только ввод на стандартный ввод:
... которая дает мне следующую информацию:
$ ls TΕSТER.txt | perl utfinfo.pl
Got 10 uchars
Char: 'T' u: 84 [0x0054] b: 84 [0x54] n: LATIN CAPITAL LETTER T [Basic Latin]
Char: 'Ε' u: 917 [0x0395] b: 206,149 [0xCE,0x95] n: GREEK CAPITAL LETTER EPSILON [Greek and Coptic]
Char: 'S' u: 83 [0x0053] b: 83 [0x53] n: LATIN CAPITAL LETTER S [Basic Latin]
Char: 'Т' u: 1058 [0x0422] b: 208,162 [0xD0,0xA2] n: CYRILLIC CAPITAL LETTER TE [Cyrillic]
Char: 'E' u: 69 [0x0045] b: 69 [0x45] n: LATIN CAPITAL LETTER E [Basic Latin]
Char: 'R' u: 82 [0x0052] b: 82 [0x52] n: LATIN CAPITAL LETTER R [Basic Latin]
Char: '.' u: 46 [0x002E] b: 46 [0x2E] n: FULL STOP [Basic Latin]
Char: 't' u: 116 [0x0074] b: 116 [0x74] n: LATIN SMALL LETTER T [Basic Latin]
Char: 'x' u: 120 [0x0078] b: 120 [0x78] n: LATIN SMALL LETTER X [Basic Latin]
Char: 't' u: 116 [0x0074] b: 116 [0x74] n: LATIN SMALL LETTER T [Basic Latin]
... который затем определяет, какие символы не являются "простыми" символами ASCII.
Надеюсь, это кому-то поможет,
Ура!
Позволяет работать с внешним символом ASCII, например: байты из,
echo -n 'á' | xxd
Юникод из А
echo -en 'á' | iconv -f utf-8 -t UNICODEBIG | xxd -g 2
так что в случае вашего имени файла мы имеем
echo -e "\x54\xCE\x95\x53\xD0\xA2\x45\x52\x2E\x74\x78\x74" | iconv -f utf-8 -t UNICODEBIG | xxd -g 2
показывая, что юникод для заглавной буквы E равен \u0395, что похоже на тот же символ, что и ASCII \x45