如何解释 Charmap 文件中的字符范围?

如何解释 Charmap 文件中的字符范围?

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 的实际行为。

处理范围时,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十六进制。

相关内容