GNU/Linux >> Linux の 問題 >  >> Linux

Unicode文字のTrアナログ?

trと同じことを行う国際化されたユーティリティが必要です :ストリームから文字を取得し、対応する文字に置き換えます。
下から上へのような特定のケースのソリューションではありませんが、一般的なケースのソリューションが必要です。コード> 可能であれば電話してください。

trに注意してください Linuxでは機能しません。文字ではなくバイトを変換します。これはマルチバイトエンコーディングでは失敗します。

$ tr --version | head -n 1
tr (GNU coreutils) 8.23
$ echo $LC_CTYPE
en_US.UTF-8
$ echo 'Ångstrom' | tr Æ Œ         
Ņngstrom

承認された回答:

GNU sed マルチバイト文字で動作します。だから:

$ echo é½Æ | sed 'y/é½Æ/ABŒ/'
ABŒ

GNU trほどではありません 国際化されていませんが、マルチバイト文字(UTF-8ロケールの非ASCII文字など)をサポートしていません。 GNU tr Æで動作します 、Œ iso8859-15文字セットのようにシングルバイトである限り。

詳細については、trに非ASCII(ユニコード)文字を認識させる方法を参照してください。

いずれにせよ、それはLinuxとは何の関係もありません、それは trについてです システムへの実装。そのシステムがLinuxをカーネルとして使用するかtrを使用するか Linux用に構築されているか、LinuxカーネルAPIを使用することは、 trの一部であるため関係ありません。 機能はユーザースペースで行われます。

busybox tr およびGNUtr Linux用に構築されたソフトウェアのディストリビューションで最も一般的に見られ、マルチバイト文字をサポートしていませんが、 trのようにLinuxに移植されたものもあります。 家宝ツールチェスト(OpenSolarisから移植されたもの)またはast-openのツールチェストです。

sedに注意してください のy a-zのような範囲はサポートしていません 。また、sed'y/é½Æ/ABā/'を含むスクリプトの場合も注意してください。 はUTF-8文字セットで記述されているため、UTF-8が文字セットではないロケールで呼び出された場合、期待どおりに機能しなくなります。

別の方法として、 perlを使用することもできます。 :

perl -Mopen=locale -Mutf8 -pe 'y/a-zé½Æ/A-ZABŒ/'

上記では、perlコードはUTF-8であると想定されていますが、ロケールのエンコーディングで入力を処理します(同じエンコーディングで出力します)。 UTF-8ロケールで呼び出された場合、UTF-8Æを音訳します。 (0xc3 0x86)からUTF-8Œ (0xc5 0x92)およびISO8859-15では同じですが、0xc6->0xbc用です。

ほとんどのシェルでは、UTF-8が文字セットではないロケール(例外は yash )でスクリプトが呼び出された場合でも、一重引用符で囲まれたUTF-8文字を使用しても問題ありません。 これらのバイトがロケールで有効な文字を形成しない場合は文句を言います)。ただし、一重引用符以外の引用符を使用している場合は、問題が発生する可能性があります。たとえば、

perl -Mopen=locale -Mutf8 -pe "y/♣`/&'/"

のエンコーディングが原因で、文字セットがBIG5-HKSCSであるロケールでは失敗します。 (0x5c)は、他のいくつかの文字(αなど)にも含まれています。 :0xa3 0x5c、およびのUTF-8エンコーディング たまたま0xa3で終わります。

関連:PIC16F877アナログピン構成?

いずれにせよ、

のようなことを期待しないでください
perl -Mopen=locale -Mutf8 -pe 'y/Á-Ź/A-Z/'

アキュートアクセントの除去に取り組みます。上記は実際にはただ

perl -Mopen=locale -Mutf8 -pe 'y/x{c1}-x{179}/x{41}-x{5a}/'

つまり、範囲はユニコードコードポイントに基づいています。そのため、「正しい」にある非常に明確に定義されたシーケンス以外では、範囲は役に立ちません。 」A-ZのようなUnicodeでの順序 、 0-9

アキュートアクセントを削除する場合は、次のようなより高度なツールを使用する必要があります。

perl -Mopen=locale -MUnicode::Normalize -pe '
  $_ = NFKD($_); s/x{301}//g; $_ = NFKC($_)'

つまり、Unicode正規化フォームを使用して文字を分解し、アキュートアクセントを削除します(ここでは、結合フォーム U + 0301 )そして再構成します。

Unicodeを音訳するためのもう1つの便利なツールは、 uconvです。 ICUから。たとえば、上記は次のように書くこともできます:

uconv -x '::NFKD; u0301>; ::NFKC;'

ただし、UTF-8データでのみ機能します。必要なもの:

iconv -t utf-8 | uconv -x '::NFKD; u0301>; ::NFKC;' | iconv -f utf-8

ユーザーのロケールでデータを処理できるようにするため。


Linux
  1. Geditで無効な文字をスキャンする方法は?

  2. 期待スクリプトで使用するために特殊文字でパスワードを変換しますか?

  3. *nix でコンソール ツールを使用して \uXXXX Unicode を UTF-8 に変換する方法

  1. Linux で wprintf が Unicode のロシア語テキストをラテン語に音訳するのはなぜですか?

  2. bibtex の Unicode 文字

  3. Vim で奇妙な文字が発生する原因は何ですか?

  1. Linux – Trに非ASCII(unicode)文字を認識させる方法は?

  2. In Echo {a..z}では特殊文字は何を表していますか?

  3. bash スクリプトで unicode を grep する方法