O glibc permite intervalos decimais de três pontos (como em POSIX) e intervalos hexadecimais de dois pontos. Isso não parece estar documentado em nenhum lugar, mas podemos vê-lo no código-fonte. Isso não é um comportamento portátil definido, mas uma extensão da glibc e possivelmente de outros. Se você está escrevendo seus próprios arquivos, use decimal.
Vamos confirmar que esse é o comportamento real da glibc.
Ao processar um intervalo, o glibc usa :
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;
}
em que isxdigit
valida um dígito hexadecimal e isdigit
decimal. Posteriormente, ele ramifica a conversão para inteiro da substring consumida da mesma maneira e continua como esperado. Anteriormente, determinou o tipo de reticências em questão durante a análise , obtida da lexer .
O arquivo de mapeamento UTF-8 é gerado mecanicamente do UnicodeData.txt
do unicode.org, criando intervalos de 64 codepontos com dois pontos. Suponho que essa auto-geração conveniente esteja pelo menos parcialmente por trás da extensão, mas não sei. Versões anteriores da glibc também geraram, mas usando um programa diferente e o mesmo formato.
Mais uma vez, isso não parece estar documentado em lugar algum, e como é gerado automaticamente próximo de onde é usado, é possível que ele mude, mas imagino que seja estável.
Se receber algo como
<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>
então é um intervalo hexadecimal , porque usa dois pontos. Com três pontos, seria um intervalo decimal POSIX.
Se você estiver em outro sistema que não tenha essa extensão, seria apenas um erro de sintaxe. Um arquivo de mapa de caracteres portátil deve usar apenas os intervalos decimais.