この古い質問を復活させてすみません。しかし、使用bash
する場合、プレーンなASCII入力からUnicodeコードポイントを作成する非常に簡単なアプローチがあり、まったくフォークしません。
unicode() { local -n a="$1"; local c; printf -vc '\\U%08x' "$2"; printf -va "$c"; }
unicodes() { local a c; for a; do printf -vc '\\U%08x' "$a"; printf "$c"; done; };
特定のコードポイントを定義するには、次のように使用します
unicode crossbones 0x2620
echo "$crossbones"
または、最初の65536のUnicodeコードポイントをstdoutにダンプします(私のマシンでは2秒未満です。追加のスペースは、シェルのモノスペースフォントが原因で特定の文字が互いに流れ込むのを防ぐためです):
for a in {0..65535}; do unicodes "$a"; printf ' '; done
または、非常に典型的な親の話を伝える(これにはUnicode 2010が必要です):
unicodes 0x1F6BC 32 43 32 0x1F62D 32 32 43 32 0x1F37C 32 61 32 0x263A 32 32 43 32 0x1F4A9 10
説明:
printf '\UXXXXXXXX'
Unicode文字を出力します
printf '\\U%08x' number
\UXXXXXXXX
数値を16進数に変換して印刷し、これを別のprintf
文字に渡されて、実際にUnicode文字を出力します
printf
8進数(0oct)、16進数(0xHEX)、10進数(0または1から9で始まる数値)を数値として認識します。そのため、最適な表現を選択できます。
printf -v var ..
の出力をフォークせずにprintf
変数に収集します(これ速度が大幅にします)。
local variable
グローバル名前空間を汚染しないためにありますか
local -n var=other
エイリアスvar
へother
のように割り当て、var
変更しますother
。ここで興味深いのvar
は、ローカルネームスペースの一部ですが、other
一部であり、グローバル名前空間の一部です。
- 以下のようなものはありませんので、予めご了承ください
local
またはglobal
名前空間がbash
。変数は環境に保持され、常にグローバルです。ローカルは、現在の値を単に格納し、関数が再び終了したときにそれを復元します。関数内から呼び出された他の関数は、local
引き続き「ローカル」値を参照します。これは、他の言語にあるすべての通常のスコープルールとは根本的に異なる概念です(そして何をするかbash
は非常に強力ですが、それを知らないプログラマーの場合はエラーにつながる可能性があります)。
"\x7F"
(UTF-8ロケールでbash
タグはあなたがあることを示唆している)...パターンによって表される単一のバイトが範囲内になることはありません\x80-\xFF
。この範囲は、1バイトのUTF-8文字では無効です。たとえば、Unicode Codepointの値U+0080
(つまり\x80
)は実際にはUTF-8で2バイトです\xC2\x80
。..