web-dev-qa-db-fra.com

Utilisation de paramètres régionaux avec les méthodes toLowerCase () et toUpperCase () de Java

Je voulais que le code convertisse tous les caractères des chaînes en majuscules ou 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, en utilisant certaines Locales, comme le turc, "retournei (sans point)au lieu dei (avec point)."

Est-il prudent d’utiliser Locales comme UK, US, ENGLISH, etc.? Y a-t-il de grandes différences entre eux lorsqu'ils sont appliqués aux chaînes?

Quel est le Locale préféré pour Strings?

55
Arjun K P

Je pense que vous devriez utiliser la locale,

Par exemple, "TITLE" .toLowerCase () dans un environnement local turc renvoie "tıtle", où 'ı' est le caractère LATINE PETITE LETTRE SANS POINT I. À obtenir des résultats corrects pour les chaînes ne tenant pas compte de la locale, utilisez toLowerCase (Locale.ENGLISH).

Je me réfère à ces liens comme solution à votre problème Et il est bon de garder à l’esprit dans votre situation "turc"

**FROM THE LINKS**

toLowerCase () respecte l'internationalisation (i18n). Il effectue le conversion de cas par rapport à vos paramètres régionaux. Quand vous appelez toLowerCase (), en interne, toLowerCase (Locale.getDefault ()) reçoit appelé. Il est sensible aux paramètres régionaux et vous ne devez pas écrire de logique autour de il interprète les paramètres régionaux 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 chaîne avant et après conversion. Ce sera 1 et 3. Oui la longueur de la chaîne avant et après la conversion de cas est différent. Votre logique ira pour un tirage au sort lorsque vous dépendez de la longueur de la chaîne dans ce scénario. Quand votre programme est exécuté dans un environnement différent, il peut échouer. Ce sera un Belle prise en revue de code.

Pour le rendre plus sûr, vous pouvez utiliser une autre méthode toLowerCase (Locale.English) et remplacez les paramètres régionaux par Anglais toujours . Mais alors vous n'êtes pas internationalisé.

Donc, le point crucial est que toLowerCase () dépend des paramètres régionaux.

référence 1
référence 2
référence 3


Dotless-i, est un minuscule 'i' sans point. La majuscule de ce caractère est le "je" habituel. Il y a un autre personnage, "I with dot". La minuscule de ce caractère est la minuscule "i" habituelle.

Avez-vous remarqué le problème? Cette conversion asymétrique pose un grave problème de programmation. Nous sommes confrontés à ce problème principalement dans les applications Java en raison de la mauvaise mise en œuvre (IMHO) des fonctions toLowerCase et toUpperCase.

En Java, la méthode String.toLowerCase () convertit les caractères en minuscules conformément aux paramètres régionaux par défaut. Cela pose des problèmes si votre application fonctionne dans les paramètres régionaux turcs et en particulier 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à blogué à propos de deux exemples sérieux: Les erreurs de compilation avec les bibliothèques de scripts avec "i" dans leurs noms et la faute de XSP Manager si un 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 génération de messages ne fonctionnaient pas dans l'environnement local turc avant la version 8. Toute personne ayant des paramètres régionaux turcs n’a pas pu installer Lotus Notes 8.5.1 (c’est réel!). La liste continue...

Il n’existe pratiquement pas de bêta-testeur en Turquie et les clients n’ouvrent pas PMR pour résoudre ces problèmes. Donc, ces problèmes ne vont pas à la première priorité pour les équipes de développement.

Même l'équipe Java a ajouté un avertissement spécial à la dernière documentation:

Cette méthode est sensible aux paramètres régionaux et peut produire des résultats inattendus si utilisé pour les chaînes destinées à être interprétées locale indépendamment. Les exemples sont les identificateurs de langage de programmation, protocole clés et balises HTML. Par exemple, "TITLE" .toLowerCase () dans un Turc locale retourne "tıtle", où 'ı' est la petite lettre laïque sans point I personnage. Pour obtenir des résultats corrects pour les chaînes insensibles à la localisation, Utilisez toLowerCase (Locale.ENGLISH).

S'IL VOUS PLAÎT LIRE LES LIENS JE CANT POST TOUT "" CE IS RÉPONSE À VOTRE COMMENTAIRE "

59
shareef

Vous pouvez créer des paramètres régionaux appropriés pour la langue de votre String

Par exemple:

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

fera le tour pour le turc.

5
Caner
String str = "CyBeRdRaGoN";

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

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

Votre application choisira les paramètres régionaux par défaut. Si quelqu'un exécute votre application en turc avec les paramètres régionaux turcs, il verra i sans point

5
alaster

En kotlin

private fun changelowertoupper(): String {
        val str = "CyBeRdRaGoN"
        return str.toLowerCase(Locale.ROOT) // or Locale.getDefault()
    }
0
Irvin Joao

Si vous utilisez cette fonction pour vérifier une chaîne (par exemple, une recherche), vous pouvez utiliser les chaînes en minuscule ou en majuscule. 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 confronte le même problème, mais dans un cas de recherche dans listview. J'ai ajouté cette réponse que cela peut aider quelqu'un qui a le même problème.

0
Alp Altunel