87 votes

Utilisation des locales avec les fonctions toLowerCase() et toUpperCase() de Java

Je voulais un code pour convertir tous les caractères des chaînes de caractères en majuscules ou en minuscules en Java.

J'ai trouvé une méthode qui ressemble à ceci :

public static String changelowertoupper()
{
         String str = "CyBeRdRaGoN";
         str=str.toLowerCase(Locale.ENGLISH);
         return str;
}

Maintenant, j'ai lu que l'utilisation de certains Locale comme le turc, "retourne i (sans point) au lieu de i (avec point) ."

L'utilisation est-elle sûre ? Locale comme UK, US, ENGLISH, etc. ? Y a-t-il de grandes différences entre eux lorsqu'ils sont appliqués aux cordes ?

Lequel est le plus préféré Locale pour String s ?

81voto

shareef Points 1482

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).

15voto

Caner Points 151

Vous pouvez créer une locale appropriée pour votre String de la langue.

Par exemple :

toUpperCase(new Locale("tr","TR"));

fera l'affaire pour les Turcs.

6voto

alaster Points 774
String str = "CyBeRdRaGoN";

str = str.toLowerCase(); // str = "cyberdragon"

str = str.toUpperCase(); // str = "CYBERDRAGON"

Votre application choisira la locale par défaut, donc si quelqu'un exécute votre application en turc avec la locale turque, il verra i sans point

1voto

Alp Altunel Points 511

Si vous utilisez cette fonction pour vérifier une chaîne de caractères (par exemple, une recherche), il est prudent d'utiliser les chaînes de caractères en minuscules ou en majuscules pour les vérifier. Vous pouvez l'utiliser comme ceci :

if (mViewData.list.data[i].Name.toLowerCase(new Locale("tr", "TR"))
   .contains(mViewHolder.tctSearch.getText().toString().trim()
                                      .toLowerCase(new Locale("tr", "TR")))) {
    // your code here...
}

Je suis confronté au même problème mais dans le cas d'une recherche dans un listview. J'ai ajouté cette réponse pour qu'elle puisse aider quelqu'un qui a le même problème.

0voto

Irvin Joao Points 1

En kotlin

private fun changelowertoupper(): String {
        val str = "CyBeRdRaGoN"
        return str.lowercase()
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X