0

I often come across a string representing UTF-16BE, such as \u0444\u0430\u0439\u043b, which would be properly rendered as файл.

I wonder: is there a simple way to "render" a text file in UTF-16BE (or simply an input string in in UTF-16BE) such as the one above by using sed or other command line tool?

See also this related question.

4

2 に答える 2

3

テキストが実際に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/printfprintf\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 への参照を削除してください。

于 2012-12-29T04:42:28.387 に答える
1

単に行う:

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

環境変数LANGutf-8次のように設定する必要がある場合があることに注意してください。

export LANG="en_US.UTF-8"

キース・トンプソンが指摘したように、使用する方がさらに良いかもしれませんprintf。したがって、次のようになります。

printf "\u0444\u0430\u0439\u043b"

上記の 2 つのオプションの場合、出力は次のようになります。

файл
于 2012-12-29T04:25:02.217 に答える