Charmap 文件/usr/share/i18n/charmaps/UTF-8.gz
有这一行:
<U3400>..<U343F> /xe3/x90/x80 <CJK Ideograph Extension A>
地图页上charmap(5)
只说它的意思是一个范围。然后我发现规格,但它说角色名称中的数字应该是十进制,而不是十六进制,并且它使用 3 个点,而不是手册页中的 2 个点。那么,我应该如何解释 Charmap 文件中的字符范围?特别是如果我看到类似的东西
<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
那么范围是十进制还是十六进制?
答案1
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
十进制数字。稍后,它以相同的方式将所消耗的子字符串转换为整数,并按照您的预期进行。早些时候,它已经确定了解析期间有问题的省略号类型, 获得来自词法分析器。
UTF-8 字符映射文件是机械生成的来自 unicode.org 的UnicodeData.txt
,用两个点创建 64 码点范围。我认为这种方便的自动生成至少部分落后于扩展,但我不知道。早期版本的 glibc 也生成它,但使用不同的程序和相同的格式。
同样,这似乎没有在任何地方记录,并且由于它是在使用位置旁边自动生成的,因此可以想象它可能会发生变化,但我想它会是稳定的。
如果给出类似的东西
<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
那么它是一个十六进制范围,因为它使用两个点。如果是三个点,则为 POSIX 小数范围。
如果您使用的另一个系统没有此扩展,则这只是一个语法错误。可移植字符映射文件应仅使用小数范围。
答案2
尖括号 ( ) 中的部分<U3400>
是统一计算系统角色的名字,数字在十六进制,正如您在比较所链接规范中的符号名称<ESC>
及其 UCS 等效项时看到的那样。<U001B>
下一部分是编码。从spec中可以看出,它有3种形式:
\d123
在哪里123是十进制,
\x123
其中123是十六进制,并且
\123
其中123是八进制。
所以<U3400>
是用十六进制字节序列表示的e3 90 80
,<U3401>
是用十六进制字节序列表示的e3 90 81
,等等。
如果你将其与描述进行比较UTF-8编码,您会看到它匹配: 3 字节序列为位
11100011 10010000 10000000
如果你将其与
1110xxxx 10yyyyyy 10zzzzzz
您会看到编码的数字是xxxx yyyy yyzz zzzz
, 或0011 0100 0000 000
, 或3400
十六进制。