Bytes e caracteres são idênticos apenas na localidade C
(aka POSIX
) padrão, mas em todas as outras localidades eles são diferentes. Portanto, se o seu sistema usa uma localidade UTF-8 (por exemplo, en_US.UTF-8
) por padrão, então as "classes de caractere" entre parênteses em gexk regexes são baseadas em caracteres , não em bytes individuais.
Por exemplo, /[eęė]/
é equivalente a /[e\xC4\x99\xC4\x97]/
, assumindo uma localidade * .UTF-8; no entanto, ele corresponderá à letra ę
, mas não č
, apesar de ambos terem C4
byte. (Por alguma razão, isso é diferente de uma simples /\xC4/
fora de uma classe de caracteres, que faz corresponder ao byte literal C4
.)
De qualquer forma, o mesmo se aplica a intervalos dentro de classes de caracteres e, como o byte FF
não cria uma sequência UTF-8 válida, a biblioteca regex pode declarar inválido todo o intervalo ou algo assim.
O gawk tem a opção -b
, --characters-as-bytes
para desativar isso.