UTF-8
Unicodeの可変長エンコーディングです。ASCIIのスーパーセットになるように設計されています。参照してくださいウィキペディアの符号化の詳細のために。\x00 \x01 \xF6 \x15
だろうUCS-4BE
か、UTF-32BE
エンコードします。
ロケールのcharmapがUTF-8(の出力を参照locale charmap
)であると仮定して、UnicodeコードポイントからUTF-8エンコーディングに到達するには、次のようにします。
$ printf '\U1F615\n'
😕
$ echo -e '\U1F615'
😕
$ confused_face=$'\U1F615'
後者は、POSIX標準の次のバージョンに含まれます。
AFAIK、その構文は、スタンドアロンのGNU printf
ユーティリティ(printf
GNUシェルのユーティリティとは対照的に)によって2000年に導入され、2003年に最初にecho
/ printf
/ $'...'
builtinsに、2004 年にksh93に、2010年にbashに(適切に動作していませんが) 2014年まで)が、明らかに他の言語に触発されました。zsh
ksh93
printf '\x1f615\n'
およびとしてもサポートしprintf '\u{1f615}\n'
ます。
$'\uXXXX'
そして、$'\UXXXXXXXX'
によってサポートされているzsh
、bash
、ksh93
、mksh
とFreeBSD sh
、GNU printf
、GNU echo
。
POSIXで使用できる桁数が少なくなるため、将来のバージョンでは変更される可能性がありますが、一部の(すべてでは\U0001F615
なく\U1F615
)すべての桁が必要です。場合はいずれのケースでは、すべての桁が必要\UXXXXXXXX
のように16進数が続くことがある\U0001F615FOX
として、\U1F615FOX
だったでしょう$'\U001F615F'OX
。
文字列の解析時または展開時に、現在のロケールのエンコーディングの文字に展開されるものもあります。ロケールに関係なくUTF-8のみで展開されるものもあります。現在のロケールのエンコーディングで文字が使用できない場合、動作はシェルによって異なります。
したがって、最高の移植性を得るには、UTF-8ロケールでのみ使用し、すべての数字を使用して、以下で使用するのが最善です$'...'
。
printf '%s\n' $'\U0001F615'
ご了承ください:
LC_ALL=C.UTF-8; printf '%s\n' $'\U0001F615'
または:
{
LC_ALL=C.UTF-8
printf '%s\n' $'\U0001F615'
}
(を含むすべてのシェルでは動作しませんbash
ので)$'\U0001F615'
されて解析された前にLC_ALL
割り当てられています。(また、システムにと呼ばれるロケールがあるという保証がないことにも注意してくださいC.UTF-8
)
必要なもの:
LC_ALL=C.UTF-8; eval "confused_face=$'\U0001F615'"
または:
LC_ALL=C.UTF-8
printf '%s\n' $'\U0001F615'
(複合コマンドまたは関数内ではない)。
逆に、UTF-8エンコーディングからUnicodeコードポイントに到達するには、この別の質問またはその質問を参照してください。
$ unicode 😕
U+1F615 CONFUSED FACE
UTF-8: f0 9f 98 95 UTF-16BE: d83dde15 Decimal: 😕
😕
Category: So (Symbol, Other)
Bidi: ON (Other Neutrals)
$ perl -CA -le 'printf "%x\n", ord shift' 😕
1f615
\U1F615
別の有効な16進数が続く場合は、エスケープシーケンスの一部と見なされることに注意してください。:それは関係なく、それはそれに続いているものの動作させるためには、長い間、正確に8桁の数字であることを十分に先行ゼロを持たなければならない\U0001F615