電子文字を半角文字に(またはその逆に)変換するには?

電子文字を半角文字に(またはその逆に)変換するには?

これは、コマンドラインで半分の幅を全幅に変換する方法に関する簡単な質問です。私はこれが私のコマンドラインに組み込まれると思いましたが、iconvここでは何も見つかりません。

$ iconv  -l | grep -i full
-> nothing
$ iconv  -l | grep -i half
-> nothing

一般的な入力は次のとおりです。

$ echo -n "Ab9876543210" | iconv -f utf8 -t utf16be | hexdump -C
00000000  ff 21 00 62 ff 19 ff 18  ff 17 ff 16 ff 15 ff 14  |.!.b............|
00000010  ff 13 ff 12 ff 11 ff 10                           |........|
00000018

答え1

uconvICUツールのユーティリティがある場合(icu-devtoolsDebianベースのオペレーティングシステムのパッケージ):

$ echo 'Ab9876543210' | uconv -x Fullwidth-Halfwidth
Ab9876543210

(また、韓国語や日本語スクリプトのように、通常は電子文字を半角記号に変換します。)

代わりにその逆をしなさいHalfwidth-Fullwidth

それ以外の場合は、ASCII印刷可能文字の全幅変形のみを変換することに興味があります。

$ echo 'Ab9876543210' | perl -C -pe 'y/\x{ff01}-\x{ff5e}/!-~/'
Ab9876543210

あるいは、U + 3000(表の文字スペース)をASCIIスペースに変換することもできます。

$ echo 'Ab9876543210' | perl -C -pe 'y/\x{3000}\x{ff01}-\x{ff5e}/ !-~/'
Ab9876543210
curl -s https://www.unicode.org/Public/UNIDATA/UnicodeData.txt | grep '<wide>'

リストに追加できる一部の非ASCII文字の全幅バリアントである追加のコンテンツがいくつか表示されます。

perl -C -pe 'y/\x{3000}\x{ff01}-\x{ff60}\x{ffe0}-\x{ffe6}/ !-~\x{2985}\x{2986}\xa2\xa3\xac\xaf\xa6\xa5\x{20a9}/'

(検索では、<narrow>一般的な電子文字の一部の半角変形が表示されますが、これは大きなリストで連続しない範囲を持つため、これを追加すると式がさらに大きくなります。)

tr一部のシステムでは、C.UTF-8ロケールであれば同じことができます。trOSベンダーからパッチを適用しない限り、現在のバージョンのGNUでは機能しません。

$ uname
FreeBSD
$ echo 'Ab9876543210' | LC_ALL=C.UTF-8 tr $'\u3000\uff01-\uff5e' ' !-~'
Ab9876543210

(また、シェルがzshをサポートしていると仮定$'\uXXXX')。

逆変換の場合にy/from/to/変更するとy/to/from/

perlモジュールにはUnicodeデータへのインターフェースもあるため、Unicode::UCD次のこともできます。

perl -C -MUnicode::UCD=charprop -pe '
  s{\p{Decomposition_Type: Wide}}{
    $cache{$&} //= charprop(ord($&), "Decomposition_Mapping")
  }ge'

キャッシュを使用して軽減しても、まだかなり遅いです。詳細については、およびを参照してくださいperldoc perlunipropsperldoc Unicode::UCD

または使用NFKD分解お持ちの方のために広い分解のタイプ:

perl -MUnicode::Normalize=NFKD -C -pe 's/\p{Dt=Wide}/NFKD$&/ge'

少なくともGNUシステムからASCIIに変換する場合、iconv -t ASCII//translitこれらの文字(そしてより多くの文字も最も近いASCII文字1表現に変換されます)

$ echo 'Stéphane' | iconv -t ASCII//translit
Stephane

もちろん、その逆の方法はありません。

とにかく、ここでは同じ文字を文字セットから目的の文字セットに変換するのではなく、一部の文字を別の文字に変換する一種の翻訳です。

iconv -luconv -lサポートされているエンコード/文字セットも同様にリストされています。uconv -L翻訳者を一覧表示します。 GNUは、その文字がターゲット文字セットに存在しない場合にのみ可能な近似値を提供します(そうでなければiconvその文字を破棄します)。//translit//ignore


1または文字Sæ->aeまたは->ffiのような全幅フォーマットはありませんが、たとえば一度近似すると、ここで説明されているソリューションのいずれも処理できない全幅の代わりにaffix変換できます。 。affixaffix

関連情報