O que significa "na localidade POSIX"?

O que significa "na localidade POSIX"?

Emessa questãohá um comentário que diz:

Tudo isso por não entender o que significa "na localidade POSIX". (-: Você realmente deveria tentar combinar letras minúsculas gregas com (digamos) sed e [[:lower:]] e um prático conjunto de localidade el_GR.UTF-8. – JdeBP

Então: o que significa "na localidade POSIX"?

Bônus: isso é válido no POSIX em localidades diferentes de C?

LC_ALL=C grep '[[:lower:]]' file

Responder1

Quando POSIX diz (para “superior”)

Na localidade POSIX, apenas:

a B C D e F G H I J K L M N o p q R S T U V W x y Z

serão incluídos:

está definindo a localidade POSIX. Isso significa que no contexto do código de idioma POSIX, a classe de caracteres “superior” consiste apenas nos caracteres listados.

O POSIX não define nenhuma outra localidade, mas os sistemas são livres para fazê-lo. Como resultado, você não pode confiar em grep '[[:lower:]]' filefazer algo útil em um local diferente do POSIX, se você se limitar apenas ao POSIX. Entretanto, muitos sistemas definem outras localidades e suas classes de caracteres. Por exemplo, em um sistema que usa as localidades da biblioteca GNU C,

$ echo 'α' | LC_ALL=el_GR.UTF-8 grep '[[:lower:]]'
α

(Isso pressupõe que o el_GR.UTF-8código do idioma esteja disponível; em derivados do Debian, uma maneira rápida de garantir isso é instalar o locales-allpacote.)

Responder2

Não entendi totalmente sua sugestão (na outra pergunta). No entanto, parece que você interpretou mal o caso de uso dolocalidade POSIX.

Sua sugestão parece ser que o local não é muitodo utilizadoramigável. E que deveria ser ajustado para que assim fosse. No entantodo utilizadoramigável não é o objetivo do posix local, esse é o trabalho de outros locais com outras regras.

O trabalho do posix local é ser previsível. Na verdade, também se beneficia por ser simples. Depois que você começa a incluir outras linguagens em um padrão, é muito difícil parar, e o resultado é um padrão que precisa de muita manutenção e é difícil de implementar.

Não há como eu, como desenvolvedor, conhecer todas as regras sobre cada idioma, como classificá-las em ordem "alfabética" e realmente saber quais são maiúsculas ou minúsculas. As regras para idiomas diferentes do inglês podem ser realmente muito complexas. Portanto, se você ajustar o Posix local para incluir as regras para todos os outros idiomas, seu comportamento será realmente muito imprevisível.

Mudanças na localidade posix poderiam de fato prejudicar o software onde os sistemas mais antigos não correspondiam ao comportamento dos sistemas mais novos. (Veja anedota abaixo)


Anedota

Um dos bugs mais obscuros e difíceis de diagnosticar que já vi foi em umFerramenta ETL"aleatoriamente" descartando linhas. Após uma análise meticulosa, descobriu-se que o software funcionou bem, mas apenas se executado com LC_COLLATE=C. Isso acontecia porque, ao combinar registros, ele dependia da ordem de classificação de um banco de dados que correspondia à sua própria ordem de classificação interna. Os desenvolvedores simplesmente nunca perceberam que em algumas localidades os números classificavam o texto em ordem alfabética "0, -1, 1, -2, 2" em vez de "-1, -2, 1, 2".

Para além da interacção do utilizador, o que isto mostra é uma necessidade genuína de os sistemas se comportarem de uma forma previsível que possa ser comum a todos os sistemas.

informação relacionada