Sappiamo tutti che l'utilizzo del metodo equals() di String per il confronto di uguaglianza fallirà miseramente. Invece, si dovrebbe usare Collator, in questo modo:Dove posso trovare una serie specifica di regole di confronto per il confronto delle uguaglianze delle stringhe?
// we need to detect User Interface locale somehow
Locale uiLocale = Locale.forLanguageTag("da-DK");
// Setting up collator object
Collator collator = Collator.getInstance(uiLocale);
collator.setStrength(Collator.SECONDARY);
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
// strings for equality testing
String test1 = "USA lover Grækenland støtte";
String test2 = "USA lover graekenland støtte";
boolean result = collator.equals(test1, test2);
Ora, questo codice funziona, che è risultato è vero meno uiLocale è impostato a Danese. In tal caso produrrà false. Certamente capisco perché questo è accaduto: questo è solo perché il metodo è uguale è implementato in questo modo:
return compare(s1, s2) == Collator.Equal;
Questo metodo chiama quello che viene utilizzato per l'ordinamento e verificare se le stringhe sono uguali. Non lo sono, poiché le regole di confronto specifiche danesi richiedono che lo æ venga ordinato dopo (se comprendo correttamente il risultato del metodo di confronto) ae. Tuttavia, queste stringhe sono davvero uguali, con questa forza sia le differenze tra i casi che i caratteri di compatibilità (che è ciò che viene chiamato) dovrebbero essere considerati uguali.
Per risolvere questo problema, è necessario utilizzare RuleBasedCollator con un set specifico di regole che funzionerà per il caso di uguaglianza.
Infine la domanda è: qualcuno sa dove posso ottenere regole così specifiche (non solo per il danese, ma anche per altre lingue), in modo che i caratteri di compatibilità, le legature, ecc. Siano trattati allo stesso modo (CLDRchart non sembra per contenere tale o non sono riuscito a cercarlo)?
O forse voglio fare qualcosa di stupido qui, e dovrei davvero usare semplicemente UCA per il confronto di uguaglianza (qualsiasi esempio di codice, per favore)?
Stringhe equivalenti() fa esattamente ciò che si suppone stia facendo e paragonando le parole con lo spelling equivalente in alcune lingue non fa parte di questo, quindi trovo che dire che fallisce miseramente è fuorviante. – Stefan
@Stefan: il problema è che non lo è. Ad esempio, per le stringhe contenenti caratteri accentati o dieresi (o o) verrà restituito ** falso ** se una delle stringhe userebbe la decomposizione canonica. L'ortografia potrebbe essere la stessa, non importa. Risultati ancora peggiori ti daranno equalsIgnoreCase() - le varianti di caso come sharp s o finale sigma non saranno riconosciute. Questo perché questi metodi usano il confronto binario che non è adatto per le stringhe internazionali. –
la parola chiave è una decomposizione canonica. Questa è una caratteristica del linguaggio (naturale) e non ha nulla a che fare con la rappresentazione di String, in realtà nella maggior parte dei casi si desidera che vengano trattati diversamente come String. Sono d'accordo con te su equalsIgnoreCase che uno è cattivo perché sfoca la linea tra una stringa che è solo un contenitore per caratteri e parole in una lingua/locale. – Stefan