これは、コマンドラインで半分の幅を全幅に変換する方法に関する簡単な質問です。私はこれが私のコマンドラインに組み込まれると思いましたが、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
uconv
ICUツールのユーティリティがある場合(icu-devtools
Debianベースのオペレーティングシステムのパッケージ):
$ 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ロケールであれば同じことができます。tr
OSベンダーからパッチを適用しない限り、現在のバージョンの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 perluniprops
。perldoc 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 -l
uconv -l
サポートされているエンコード/文字セットも同様にリストされています。uconv -L
翻訳者を一覧表示します。 GNUは、その文字がターゲット文字セットに存在しない場合にのみ可能な近似値を提供します(そうでなければiconv
その文字を破棄します)。//translit
//ignore
1または文字Sæ
->ae
またはffi
->ffi
のような全幅フォーマットはありませんが、たとえば一度近似すると、ここで説明されているソリューションのいずれも処理できない全幅の代わりにaffix
変換できます。 。affix
affix