Как я могу отображать UTF-16BE в командной строке?

Я часто сталкиваюсь с строкой, представляющей UTF-16BE, такой как \u0444\u0430\u0439\u043b , который будет правильно отображаться как файл .

Интересно: существует ли простой способ «визуализации» текстового файла в UTF-16BE (или просто входной строки в UTF-16BE), например, выше, с помощью sed или другого инструмента командной строки?

См. Также этот связанный вопрос .

    Предполагая, что текст действительно закодирован в UTF-16BE (а не, как вы видите в своем вопросе, как строка ASCII, содержащая обратную косую черту и символы 'u' ), вы можете использовать команду iconv .

    Предполагая, что ваш язык настроен на обработку вывода UTF-8:

     iconv -f utf-16be -t utf-8 [input-file] 

    РЕДАКТИРОВАТЬ :

    Основываясь на ваших комментариях, то, что у вас есть, вовсе не UTF-16BE; это, по-видимому, простой ASCII, кодирующий коды кода Unicode с использованием синтаксиса \u.... Это не формат, который признает iconv (насколько я знаю).

    Вы должны отредактировать свой вопрос, удалив любые ссылки на UTF-16BE и более точно объяснив, какие данные у вас есть, и что вы хотите с ним делать. Откуда взялись эти струны? Сохраняются ли они в текстовом файле или они происходят из какого-то другого источника (скажем, выхода какой-то программы)? Входит ли вход целиком из \u.... , или он смешивается с другими данными? И настроены ли ваши настройки языка для отображения UTF-8?

    Если у вас есть строка, содержащая "\u0444\u0430\u0439\u043b" (это 24 символа ASCII), тогда команда printf должна работать – если вы используете достаточно недавнюю версию printf .

    printf – это как встроенная shell, так и внешняя команда, /usr/bin/printf , часть пакета GNU coreutils.

    В моей системе работает следующее:

     $ s='\u0444\u0430\u0439\u043b' $ printf "$s\n" файл 

    Или вы можете использовать формат %b (это специфично для команды printf() функция printf() C не делает этого), которая интерпретирует escape-обратные экраны в строках аргументов (обычно они интерпретируются только в строке формата):

     $ printf "%b\n" "$s" файл 

    В другой системе с более старой версией bash встроенный printf не распознает \u – но /usr/bin/printf делает. Похоже, что команда coreutils printf получила поддержку \u экранов раньше, чем bash.

     $ s='\u0444\u0430\u0439\u043b' $ printf "$s\n" \u0444\u0430\u0439\u043b $ printf "%b\n" "$s" \u0444\u0430\u0439\u043b $ /usr/bin/printf "$s\n" файл $ /usr/bin/printf "%b\n" "$s" файл 

    Все это предполагает, что в переменной есть строка '\u0444\u0430\u0439\u043b' . Если это файл, вы можете разложить содержимое файла в переменную оболочки, возможно, строку за раз, но это не лучшее решение. В этом случае этот скрипт Perl должен выполнять эту работу; он копирует свой вход в stdout, заменяя последовательности \u.... с соответствующим символом Юникода, закодированным в UTF-8; вход может быть одним или несколькими файлами, указанными в командной строке, или стандартным вводом, если он вызван без аргументов.

     #!/usr/bin/perl use strict; use warnings; use utf8; binmode(STDOUT, ":utf8"); while (<>) { s/\\u([\da-fA-F]{4})/chr(hex($1))/eg; print; } 

    Опять же, пожалуйста, отредактируйте свой вопрос, чтобы он отражал вашу фактическую проблему и отбрасывал любые ссылки на UTF-16BE.

    Просто выполните:

     echo -e "\u0444\u0430\u0439\u043b" 

    Обратите внимание, что вам может потребоваться установить вашу переменную LANG в utf-8 :

     export LANG="en_US.UTF-8" 

    Как указал Кейт Томпсон, может быть даже лучше использовать printf ; поэтому у вас есть:

     printf "\u0444\u0430\u0439\u043b" 

    И для двух вышеперечисленных вариантов выход:

     файл