Domanda

Sto scrivendo una funzione di confronto delle stringhe per ordinare i termini medici che spesso contengono caratteri accentati speciali da molte lingue europee diverse e devo in qualche modo ottenere un confronto simile al latin1_general_ci di MySQL.

In primo luogo, sto eseguendo alcune operazioni di base sulle stringhe per rimuovere spazi, virgolette, trattini, parentesi, ecc. Il problema si presenta quando passo le stringhe su strcoll () usando l'impostazione predefinita locale, perché non è abbastanza intelligente da considerare, ad esempio, una accentata e come lessicograficamente equivalente a una normale e.

Sono cauto nell'usare un locale come il tedesco o il francese perché probabilmente non includerà tutti i caratteri speciali che devo considerare. Esiste un locale che mi darà qualcosa di simile al confronto latin1_general_ci ? O c'è forse un'altra soluzione?

La mia ingenua soluzione sarebbe quella di creare un grande array associativo per mappare le lettere accentate ai loro equivalenti di lettere regolari, quindi usarlo con str_replace () , ma suona lento e noioso (e soggetto a errori ). Preferirei usare qualcosa incorporato nella lingua, se possibile.

Sempre su quella nota, strcmp () o strcasecmp () rispetta le regole di confronto della locale corrente, oppure è solo strcoll () che fa questo?

È stato utile?

Soluzione

Forse questo:

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

strcmp () e strcasecmp () non sono localizzati.

Altri suggerimenti

Puoi anche provare le funzioni iconv per aiutare a normalizzare il stringhe. Questo gestirà l'accento e in situazioni normali. Vedi questa domanda correlata su ordinamento delle stringhe utf8 anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top