Je pense que vous devriez utiliser la locale ,
Par exemple, "TITLE".toLowerCase() dans une locale turque retourne "tıtle", où 'ı' est le caractère LATIN SMALL LETTER DOTLESS I. Pour obtenir des résultats corrects pour les chaînes de caractères insensibles à la locale, utilisez toLowerCase(Locale.ENGLISH).
Je considère ces liens comme la solution à votre problème. et il a des points à garder à l'esprit dans votre situation "turque".
**FROM THE LINKS**
toLowerCase() respecte l'internationalisation (i18n). Elle effectue la conversion de la casse en fonction de votre Locale. Lorsque vous appelez toLowerCase(), en interne, toLowerCase(Locale.getDefault()) est appelé. appelé. Il est sensible à la locale et vous ne devriez pas écrire une logique autour de logique autour de l'interprétation de la locale indépendamment.
import java.util.Locale;
public class ToLocaleTest {
public static void main(String[] args) throws Exception {
Locale.setDefault(new Locale("lt")); //setting Lithuanian as locale
String str = "\u00cc";
System.out.println("Before case conversion is "+str+
" and length is "+str.length());// Ì
String lowerCaseStr = str.toLowerCase();
System.out.println("Lower case is "+lowerCaseStr+
" and length is "+lowerCaseStr.length());// iı`
}
}
Dans le programme ci-dessus, regardez la longueur de la chaîne avant et après conversion. Elle sera de 1 et 3. Oui, la longueur de la chaîne de caractères avant et après la conversion de la casse est différente. Votre logique va s'effondrer si vous dépendez de la longueur de la chaîne dans ce scénario. Lorsque votre programme est exécuté dans un environnement différent, il peut échouer. Ce sera une une belle prise dans la revue de code.
Pour le rendre plus sûr, vous pouvez utiliser une autre méthode toLowerCase(Locale.English) et remplacer la locale par l'anglais. Mais alors vous n'êtes pas internationalisé.
L'essentiel est donc que toLowerCase() est spécifique à la locale.
référence 1
référence 2
référence 3
Dotless-i, est un "i" minuscule sans point. La majuscule de ce caractère est le "I" habituel. Il existe un autre caractère, "I avec point". La minuscule de ce caractère est le "i" minuscule habituel.
Avez-vous remarqué le problème ? Cette conversion non symétrique pose un sérieux problème de programmation. Nous sommes confrontés à ce problème principalement dans les applications Java à cause (IMHO) d'une mauvaise implémentation des fonctions toLowerCase et toUpperCase.
En Java, la méthode String.toLowerCase() convertit les caractères en minuscules selon la locale par défaut. Cela pose des problèmes si votre application fonctionne dans la locale turque et surtout si vous utilisez cette fonction pour un nom de fichier ou une url qui doit obéir à un certain jeu de caractères.
J'ai déjà parlé de deux exemples sérieux dans mon blog : Les erreurs de compilation avec les bibliothèques script avec "i" dans leur nom et la faute de XSP Manager si une XPage est dans une base de données avec "I" dans son nom.
Il y a une longue histoire, comme je l'ai dit. Par exemple, dans certaines versions de R7, le routeur était incapable d'envoyer un message à un destinataire si son nom commençait par "I". Les agents de notification des messages ne fonctionnaient pas en langue turque avant la R8. Toute personne dont les paramètres locaux sont turcs ne pouvait pas installer Lotus Notes 8.5.1 (c'est vrai !). La liste est longue...
Il n'y a presque pas de bêta-testeur en Turquie et les clients n'ouvrent pas PMR pour ces problèmes. Ces problèmes ne sont donc pas la première priorité des équipes de développement.
Même l'équipe Java a ajouté un avertissement spécial à la dernière documentation :
Cette méthode est sensible à la locale, et peut produire des résultats inattendus si si elle est utilisée pour des chaînes de caractères destinées à être interprétées indépendamment. Les exemples sont les identifiants de langage de programmation, les protocoles de protocole et les balises HTML. Par exemple, "TITLE".toLowerCase() dans une locale turque turc renvoie "tıtle", où 'ı' est le caractère LATIN SMALL LETTER DOTLESS I sans points. Pour obtenir des résultats corrects pour les chaînes de caractères insensibles aux paramètres locaux, utilisez toLowerCase(Locale.ENGLISH).