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

yt7*_*7q- 6 character-encoding posix locale

魅力图文件/usr/share/i18n/charmaps/UTF-8.gz有这一行:

<U3400>..<U343F> /xe3/x90/x80 <CJK Ideograph Extension A>
Run Code Online (Sandbox Code Playgroud)

地图页面charmap(5)只说这意味着一个范围。然后我找到了 spec,但它说字符名称中的数字应该是十进制的,而不是十六进制的,它使用 3 个点,而不是手册页中的 2 个。那么,我应该如何解释 charmap 文件中的字符范围?特别是如果我看到类似的东西

<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
Run Code Online (Sandbox Code Playgroud)

那么范围是十进制还是十六进制?

Mic*_*mer 5

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;
       }
Run Code Online (Sandbox Code Playgroud)

其中isxdigit验证十六进制数字和isdigit十进制。稍后,它以相同的方式将转换为消耗的子字符串的整数分支,并按您的预期进行。早些时候,它在解析过程中确定了有问题的省略号类型从词法分析器中获得。

UTF-8 charmap 文件从 unicode.org机械生成UnicodeData.txt,创建了两个点的 64 码点范围。我想这种方便的自动生成至少部分支持扩展,但我不知道。早期版本的 glibc 也生成了它,但使用不同的程序和相同的格式。

同样,这似乎没有记录在任何地方,而且因为它是在使用它的地方旁边自动生成的,所以可以想象它可能会改变,但我想它会很稳定。


如果给出类似的东西

<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
Run Code Online (Sandbox Code Playgroud)

那么它是一个十六进制范围,因为它使用两个点。使用三个点,它将是一个 POSIX 十进制范围。

如果你在另一个没有这个扩展的系统上,那只是一个语法错误。可移植字符映射文件应仅使用十进制范围。