Pergunta

Tenho uma pergunta sobre a cultura invariante do Windows.

Sucintamente, minha pergunta é:

Existe algum par de caracteres C1 e C2 de modo que:

inferior (c1, invariante) =latim-geral inferior (C2, invariante)

mas

inferior (c1, invaraint)! =invariante inferior (C2, invariante)

Fundo:

Preciso armazenar uma string invariante de minúsculas (representando um nome de arquivo) dentro do SQL Server Compact, que não suporta colações invariantes do Windows.

Idealmente, gostaria de fazer isso sem precisar retirar toda a minha lógica de comparação do banco de dados e para o meu aplicativo.

A idéia que tive para resolver isso foi armazenar 2 versões de todos os nomes de arquivos: um usado para exibir dados para o cliente e outro usado para realizar comparações. A coluna de comparação seria convertida em minúsculas usando o local do Windows Invariant antes de armazená -lo no banco de dados.

No entanto, eu realmente não tenho ideia de que tipo de mapeamentos a cultura invariante, além do fato de que o Windows usa para comparar nomes de arquivos.

Estou me perguntando se é possível obter falsos positivos (ou falsos negativos) como resultado desse esquema.

Ou seja, posso produzir caracteres (anteriormente mais baixos usando a cultura invariante) que se comparam iguais a usar o caso de servidor SQL insensível latino-general-1, mas não se compararem iguais sob a cultura invariante?

Se isso pode acontecer, meu aplicativo poderá considerar 2 arquivos que o Windows acha que são diferentes como o mesmo. Isso pode levar à perda de dados.

NOTA:

Estou ciente de que é possível ter arquivos sensíveis ao caso no Windows. No entanto, não preciso apoiar esses cenários.

Foi útil?

Solução

Olhando através das respostas para esta pergunta:

Comparação de Nome-Nome do Nome do Nome do Win32

que eu perguntei um tempo atrás.,

Encontrei um link indireto na página a seguir:

http://msdn.microsoft.com/en-us/library/ms973919.aspx

Ele sugere o uso de uma comparação ordinal após uma caixa superior invariante como a melhor maneira de imitar o que o sistema de arquivos faz.

Então, acho que se eu uso o agrupamento "sensível ao caso e sensível ao sotaque" no banco de dados e faça um "superior" usando o local invariante antes de armazenar os arquivos, devo ficar bem.

Alguém sabe se há algum problema com isso?

Outras dicas

Por que você não converte nomes de arquivos em ASCII? Na sua situação, os nomes de arquivos podem conter caracteres não-ASCII?

Por que não encomendar o URL a representação do UTF8 BYTE do nome do arquivo para obter uma versão ASCII que pode ser convertida de volta ao Unicode facilmente sem qualquer perda possível?

"No entanto, eu realmente não tenho ideia de que tipo de mapeamentos a cultura invariante, além do fato de que o que o Windows usa para comparar nomes de arquivos".

Não achei que o Windows usasse a cultura invariante ao comparar nomes de arquivos. Por exemplo, se minha cultura é inglês, posso citar dois arquivos separados turcos e turkish, mas se a cultura de alguém for turca, espero que o Windows não os deixe fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top