Pergunta

Eu estou escrevendo uma string comparar função para termos sorte médicos que muitas vezes contêm caracteres acentuados especiais de vários idiomas europeus diferentes, e eu preciso de alguma forma conseguir um agrupamento semelhante ao latin1_general_ci do MySQL.

Em primeiro lugar, eu estou fazendo alguns munging básicas sobre as cordas para remover espaços, citações, hífens, parênteses, etc. O problema surge quando eu passar as cordas para strcoll() usando o locale padrão, porque não é inteligente o suficiente para Consideremos, por exemplo, um e acentuado como lexicographically equivalente a um e normal.

Eu sou cauteloso ao usar uma localidade como o alemão ou francês, porque ele provavelmente não vai incluir todos os caracteres especiais I precisa considerar. Existe uma localidade que vai me dar algo para semelhante ao agrupamento latin1_general_ci? Ou há talvez uma outra solução?

A minha solução ingênua seria a criação de uma grande matriz associativa para mapear letras acentuadas para seus equivalentes regulares carta, em seguida, usando isso com str_replace(), mas que soa lento e tedioso (e propenso a erros). Eu prefiro usar algo construído dentro da linguagem, se possível.

Também nessa nota, faz strcmp() ou strcasecmp() respeitar o agrupamento da localidade atual, ou é apenas strcoll() que faz isso?

Foi útil?

Solução

Talvez isto:

setlocale(LC_COLLATE, 'fr_FR.Latin1', 'fr.Latin1', 'fr_FR.Latin-1', 'fr.Latin-1');

strcmp() e strcasecmp() não são localizados.

Outras dicas

Você também pode tentar os iconv funções para ajudar a normalizar o cordas. Isso vai lidar com o e acentuado a situações normais e. Veja esta pergunta relacionada sobre classificação utf8 cordas também.

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