Locale
如何解釋charmap文件中的字元範圍?
Charmap 文件
/usr/share/i18n/charmaps/UTF-8.gz
有這一行:<U3400>..<U343F> /xe3/x90/x80 <CJK Ideograph Extension A>
地圖頁面
charmap(5)
只說它意味著一個範圍。然後我找到了 spec,但它說字元名稱中的數字應該是十進制的,而不是十六進制的,並且它使用 3 個點而不是手冊頁中的 2 個點。那麼,我應該如何解釋charmap文件中的字元範圍?特別是如果我看到類似的東西<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
那麼範圍是十進制還是十六進制?
glibc 允許三點十進制範圍(如在 POSIX 中)和兩點十六進制範圍。這似乎沒有在任何地方記錄,但我們可以在原始碼中看到它。這不是定義的可移植行為,而是 glibc 和可能其他的擴展。如果您正在編寫自己的文件,請使用十進制。
讓我們確認這是 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
驗證十六進制數字和isdigit
十進制。稍後,它以相同的方式將轉換為已消耗子字元串的整數分支,並按照您的預期進行。早些時候,它在解析期間確定了從 lexer獲得的有問題的省略號類型。UTF-8 Charmap 文件是從 unicode.org機械生成
UnicodeData.txt
的,創建帶有兩個點的 64 個程式碼點範圍。我想這種方便的自動生成至少部分落後於擴展,但我不知道。早期版本的 glibc 也生成它,但使用不同的程序和相同的格式。同樣,這似乎沒有在任何地方記錄,並且由於它是在使用它的位置旁邊自動生成的,因此可以想像它可能會發生變化,但我想它會是穩定的。
如果給出類似的東西
<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
那麼它是一個十六進制範圍,因為它使用兩個點。使用三個點,這將是一個 POSIX 十進制範圍。
如果您在另一個沒有此副檔名的系統上,那將只是一個語法錯誤。可移植字元映射文件應該只使用十進制範圍。