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)
那么范围是十进制还是十六进制?
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;
}
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 十进制范围。
如果你在另一个没有这个扩展的系统上,那只是一个语法错误。可移植字符映射文件应仅使用十进制范围。