テキストが実際にUTF-16BEでエンコードされていると仮定すると(質問で示したように、バックスラッシュと文字を含むASCII文字列ではあり'u'
ません)、iconv
コマンドを使用できます。
ロケールが UTF-8 出力を処理するように設定されていると仮定します。
iconv -f utf-16be -t utf-8 [input-file]
編集 :
あなたのコメントに基づいて、あなたが持っているのはUTF-16BEではありません。\u....
それは明らかに単純な ASCII であり、構文を使用して Unicode コード ポイントをエンコードします。これは認識できる形式ではありませんiconv
(私の知る限り)。
質問を編集して、UTF-16BE への参照を削除し、実際に持っているデータとそのデータで何をしたいかをより正確に説明する必要があります。これらの文字列はどこから来たのですか? それらはテキスト ファイルに保存されていますか、それとも他のソース (プログラムの出力など) から取得されたものですか? 入力は完全に で構成されていますか\u....
、それとも他のデータと混合されていますか? また、UTF-8 を正しく表示するようにロケール設定が構成されていますか?
"\u0444\u0430\u0439\u043b"
(24 個の ASCII 文字)を含む文字列がある場合printf
、十分に新しいバージョンの.printf
printf
シェルの組み込みコマンドと外部コマンドの両方で/usr/bin/printf
あり、GNU coreutils パッケージの一部です。
以下は私のシステムで動作します:
$ s='\u0444\u0430\u0439\u043b'
$ printf "$s\n"
файл
または、%b
フォーマットを使用することもできます (これはコマンドに固有のものprintf
です。C のprintf()
関数はこれを行いません)。これは、引数文字列のバックスラッシュ エスケープを解釈します (通常、フォーマット文字列でのみ解釈されます)。
$ printf "%b\n" "$s"
файл
古いバージョンの bash を使用する別のシステムでは、ビルトインはエスケープprintf
を認識しませんが、認識します。coreutilsコマンドは、bash よりも早くエスケープのサポートを得たようです。\u
/usr/bin/printf
printf
\u
$ 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'
これはすべて、変数に文字列があることを前提としています。ファイル内にある場合は、ファイルの内容をおそらく一度に 1 行ずつシェル変数に丸呑みすることができますが、これは最善の解決策ではありません。その場合、この Perl スクリプトがその役割を果たします。入力を stdout にコピーし、\u....
シーケンスを UTF-8 でエンコードされた対応する Unicode 文字に置き換えます。入力は、コマンド ラインで指定された 1 つ以上のファイル、または引数なしで呼び出された場合の標準入力のいずれかです。
#!/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 への参照を削除してください。