Charmap ファイルには/usr/share/i18n/charmaps/UTF-8.gz
次の行があります。
<U3400>..<U343F> /xe3/x90/x80 <CJK Ideograph Extension A>
地図ページにはcharmap(5)
範囲を意味するとのみ表示されます。それから私は見つけました。仕様しかし、文字名の数字は16進数ではなく10進数でなければならないことが示されており、マニュアルページのように2点ではなく3点を使用します。それでは、Charmapファイルの文字範囲をどのように解釈する必要がありますか?特に私が次のようなものを見ると
<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
それでは、範囲は10進数ですか、16進数ですか?
答え1
glibcは、POSIXと同様に、3桁の10進数の範囲と2桁の16進数の範囲を受け入れます。これはどこにも文書化されていないようですが、ソースコードで見ることができます。これはいいえ移植可能な動作が定義されていますが、glibcやその他の可能な拡張機能を使用できます。独自のファイルを作成する場合は、10進数を使用してください。
これがglibcの実際の動作であることを確認してみましょう。
if (decimal_ellipsis)
while (isdigit (*cp) && cp >= from)
--cp;
else
while (isxdigit (*cp) && cp >= from)
{
if (!isdigit (*cp) && !isupper (*cp))
lr_error (lr, _("\
hexadecimal range format should use only capital characters"));
--cp;
}
isxdigit
16進数とisdigit
10進数を検証します。後で同じ方法で消費された部分文字列を整数に変換し、期待どおりに実行します。以前は、解析中に問題がある省略記号の種類を特定していました。、得る語彙アナライザで。
UTF-8文字マップファイル機械的に生成されますunicode.orgでは、UnicodeData.txt
2つのポイントを使用して64コードポイントの範囲を作成します。私はこの便利な自動生成が少なくとも部分的に拡張機能より遅れていると思いますが、よくわかりません。以前のバージョンのglibcでもこれを生成しましたが、他のプログラムと同じ形式を使用しました。
今回もこれはどこにも文書化されていないようで、使用する場所の横に自動的に生成されるので変わることもあるでしょうが、安定していると思います。
次のようなものが与えられると
<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
もしそうなら16進数範囲は2つの点を使用するためです。 3つの点がある場合は、POSIXの10進数の範囲です。
この拡張子を持たない他のシステムを使用している場合、これは構文エラーです。ポータブル文字マップファイルは少数の範囲のみを使用してください。
答え2
山括弧( )内の部分<U3400>
は統合コンピューティングシステムキャラクター名、番号は16進数<ESC>
、リンクされた仕様のシンボル名と対応するUCSを比較するとわかるように。<U001B>
次の部分はエンコードです。仕様に示すように、3つの形式があります。
\d123
どこ123は10進数です。
\x123
ここで123
\123
は16進数です。1238進数です。
したがって、<U3400>
16進バイトシーケンスで表されe3 90 80
、<U3401>
16進バイトシーケンスで表されますe3 90 81
。
説明と比較するとUTF-8エンコードすると、一致するものが表示されます:3バイトシーケンス(ビット)
11100011 10010000 10000000
と組み合わせると
1110xxxx 10yyyyyy 10zzzzzz
エンコードされた数値がxxxx yyyy yyzz zzzz
、、または0011 0100 0000 000
、または3400
16進数であることがわかります。