4

特殊文字を含む文字列matchで関数を使用する際に問題があります。awkファイルを検討してくださいtest.awk

{
    match($0,"(^.*)kon",a);
    print a[1];
}

対応するテスト ファイル "test.txt" の内容は "Testing Håkon" (ノルウェー文字 "å" に注意)。ファイルは「iso-8859-1」でエンコードされ、長さは 14 バイトです。ファイルの 16 進ダンプは次のように与えられますxxd -p test.txt

54657374696e672048e56b6f6e0a

そこから、ノルウェー文字「å」が 16 進数の「e5」でエンコードされていることがわかります。つまり、ファイルは iso-8859-1 エンコードを使用してエンコードされています。

ランニング

awk  -f test.awk test.txt

ターミナルで何も与えません..正しい出力は「Testing Hå」であるはずですが..

localeコマンドの実行結果は次のとおりです。

LANG=en_DK.UTF-8
LANGUAGE=en_US:
LC_CTYPE="en_DK.UTF-8"
LC_NUMERIC="en_DK.UTF-8"
LC_TIME="en_DK.UTF-8"
LC_COLLATE="en_DK.UTF-8"
LC_MONETARY="en_DK.UTF-8"
LC_MESSAGES="en_DK.UTF-8"
LC_PAPER="en_DK.UTF-8"
LC_NAME="en_DK.UTF-8"
LC_ADDRESS="en_DK.UTF-8"
LC_TELEPHONE="en_DK.UTF-8"
LC_MEASUREMENT="en_DK.UTF-8"
LC_IDENTIFICATION="en_DK.UTF-8"
LC_ALL=

これは、「LANG」変数が utf-8 エンコーディングに設定されていることを示しています。

4

2 に答える 2

2

コードを次のように変更しました。

{
    match($0,"(^.*)kon",a);
    print ">>>" a[1] "<<<";
}

GNU Awk 3.1.6Windows 7 で実行した結果:

>>>Hå<<<

実行中のUbuntuでは、次のGNU Awk 3.1.8ようになります。

>>><<<

目的の出力を得るには、ロケール設定を一時的に変更して翻訳する必要がありました。

LC_ALL=ISO_8859-1 awk -f test.awk test.txt | iconv -f ISO_8859-1 -t UTF-8
于 2013-05-26T15:14:39.673 に答える
1

awkこれはsee hereの問題ではありません。あなたlocaleはUTF-8エンコーディングを期待していますが、あなたのファイルはそれを使用してiso-8859-1いるので、あなたのファイルと一致するように設定するかlocale、その逆を行ってください。

注: の 2 番目の引数はmatch()正規表現である必要があり、末尾;は必要ありません

{
    match($0,/(^.*)kon/,a)
    print a[1]
}
于 2013-05-26T15:09:56.757 に答える