イタリア語と中国語で書かれたテキストで作業していますAWK
。どうすればいいですか?
私は試した:
4E00 thru 9FFF (344 270 200 thru 351 277 277)
[テストに必要な中国語のUnicode文字範囲>"\343" and <"\352"
(4文字UTF-8コードの選択を防ぐため)]:
{
f=0;
for ( i=1; i<=length; i++)
if(substr($0, i, 1)>"\343" &&substr($0, i, 1)<"\352")
f = 1
print $f
}
しかし、エラー以上があります。見つかりません。
ベストアンサー1
問題は、UTF-8文字ストリームの生のバイトをフィルタリングすると、UTF-8ファイルからUnicodeシーケンスの一部を食べることになり、無効なバイトシーケンスが発生することです。それは動作しません。代わりに、UTF-8を理解し(ネイティブバイトではなく)Unicodeデータにフィルタを適用するツールを使用する必要があります。
awk
どの実装を使用しているかわからないので、Unicodeをサポートしているかどうかはわかりません。しかし、私はPerlが完全にUnicodeで安全であることを知っているので、次のPerlの1行コードが機能するはずです。
perl -CS -p -e 's/[^\s\p{Han}]//g'
\s
私はあなたが見たいと思うと仮定します。この\p{Han}
ビットは、Unicodeで宣言された文字が漢字(つまり漢字)に使用されるものと一致させたいことをPerlに伝えます。その範囲に含まれていない句読点が必要かどうかわかりません。その場合、句読点も追加する必要があります。
次に、範囲を前の範囲に否定し、最後にグローバル置換コマンド^
(s///g
)でそれをエンコードして、Perlに最初のスラッシュの後の部分インスタンス(否定された範囲または「この範囲にないすべての項目」)を次に置き換えるように指示します。 。 2番目と3番目の前の部分(つまりなし)。
複数の範囲を含める必要がない場合は、[^]
構成を中断して同じ一致反転を実行する\P
not使用に切り替えることができます。\p
残りは、私たちが入力した文字範囲(漢字のUnicode文字とスペース)です。
詳細については、次を参照してください。perldoc perlre
Perlが正規表現を処理する方法の説明perldoc perluniprops
\p{}
可能なUnicode属性(または構文に配置できるビット)のリスト\P{}
。