webentwicklung-frage-antwort-db.com.de

Verwenden von Gebietsschemata mit toLowerCase () und toUpperCase () von Java

Ich wollte Code, um alle Zeichen in Strings in Java in Groß- oder Kleinbuchstaben zu konvertieren.

Ich habe eine Methode gefunden, die in etwa so aussieht:

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

Jetzt habe ich gelesen, dass ich bestimmte Locales wie Türkisch verwendet, "gibt i (ohne Punkt) anstelle von i (mit Punkt) zurück."

Ist es sicher, Locales wie UK, US, ENGLISH usw. zu verwenden? Gibt es große Unterschiede zwischen ihnen, wenn sie auf Saiten angewendet werden?

Welches ist die am meisten bevorzugte Locale für Strings?

55
Arjun K P

Ich denke, Sie sollten locale verwenden,

Zum Beispiel gibt "TITLE" .toLowerCase () in einem türkischen Gebietsschema .__ zurück. "tıtle", wobei "ı" der Buchstabe "LATIN SMALL LETTER DOTLESS I" ist. Zu Um korrekte Ergebnisse für localsensitive Strings zu erhalten, verwenden Sie toLowerCase (Locale.ENGLISH).

Ich beziehe mich auf diese Links als Lösung für Ihr Problem Und es sollte in Ihrer Situation "Türkisch" beachtet werden.

**FROM THE LINKS**

toLowerCase () respektiert die Internationalisierung (i18n). Es führt die Fallkonvertierung in Bezug auf Ihr Gebietsschema. Wenn du anrufst toLowerCase (), intern toLowerCase (Locale.getDefault ()) erhält namens. Das Gebietsschema ist empfindlich und Sie sollten keine Logik um .__ schreiben. es interpretiert das Gebietsschema unabhängig.

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ı`
    }
}

Schauen Sie sich im obigen Programm die Stringlänge vor und nach .__ an. Umwandlung. Es wird 1 und 3 sein. Ja die Länge der Zeichenfolge vor und danach ist die Konvertierung anders. Ihre Logik wird für einen Wurf gehen wenn Sie in diesem Szenario von der Stringlänge abhängig sind. Wenn Ihr Programm Wird in einer anderen Umgebung ausgeführt, kann dies fehlschlagen. Dies wird ein .__ sein. Netter Fang im Code-Review.

Um es sicherer zu machen, können Sie eine andere Methode verwenden toLowerCase (Locale.English) und überschreiben Sie das Gebietsschema immer mit Englisch . Aber dann bist du nicht internationalisiert.

Der entscheidende Punkt ist, toLowerCase () ist länderspezifisch.

Referenz 1
Referenz 2
Referenz 3


Dotless-i ist ein kleines "i" ohne Punkt. Der Großbuchstabe dieses Zeichens ist das übliche "Ich". Es gibt ein anderes Zeichen, "Ich mit Punkt". Das Kleinbuchstabe dieses Zeichens ist das übliche Kleinbuchstabe "i".

Hast du das Problem bemerkt? Diese unsymetrische Konvertierung verursacht ein ernstes Problem bei der Programmierung. Wir stehen diesem Problem meistens in Java-Anwendungen wegen (IMHO) schlechter Implementierung von toLowerCase- und toUpperCase-Funktionen gegenüber.

In Java konvertiert die Methode String.toLowerCase () Zeichen entsprechend der Standardeinstellung in Kleinbuchstaben. Dies führt zu Problemen, wenn Ihre Anwendung im türkischen Gebietsschema funktioniert und insbesondere, wenn Sie diese Funktion für einen Dateinamen oder eine URL verwenden, die einem bestimmten Zeichensatz entsprechen müssen.

Ich habe bereits über zwei ernstzunehmende Beispiele gebloggt: Die Kompilierfehler bei Script-Bibliotheken mit "i" im Namen und XSP-Manager-Fehler, wenn eine XPage in einer Datenbank mit "I" im Namen enthalten ist.

Wie gesagt, es gibt eine lange Geschichte. In einigen R7-Versionen konnte der Router beispielsweise keine Nachricht an einen Empfänger senden, wenn sein Name mit "I" beginnt. Nachrichtenberichtsagenten wurden in türkischem Gebietsschema bis R8 nicht ausgeführt Jeder mit einem türkischen Gebietsschema konnte Lotus Notes 8.5.1 nicht installieren (es ist echt!). Die Liste geht weiter...

Es gibt fast keinen Betatester aus der Türkei und Kunden öffnen PMR nicht für diese Probleme. Daher stehen diese Probleme für Entwicklungsteams nicht an erster Stelle.

Selbst das Java-Team hat der aktuellen Dokumentation eine spezielle Warnung hinzugefügt:

Diese Methode ist empfindlich auf das Gebietsschema und kann zu unerwarteten Ergebnissen führen, wenn Wird für Zeichenfolgen verwendet, die als Gebietsschema interpretiert werden sollen unabhängig. Beispiele sind Programmiersprachen-IDs, Protokoll Schlüssel und HTML-Tags. Zum Beispiel "TITLE" .toLowerCase () in einem Türkisch locale gibt "tıtle" zurück, wobei "ı" der LATEINISCHE KLEINE BUCHSTABELLE DOTLESS I .__ ist. Charakter. Um korrekte Ergebnisse für ortsunabhängige Zeichenfolgen zu erhalten, Verwenden Sie toLowerCase (Locale.ENGLISH).

BITTE LESEN SIE DIE LINKS, DIE ICH KANN POST ALLE "ES" IS AUF IHRE KOMMENTAR ANTWORTEN "

59
shareef

Sie können ein geeignetes Gebietsschema für die Sprache Ihres String erstellen. 

Zum Beispiel:

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

wird den Trick für Türkisch tun.

5
Caner
String str = "CyBeRdRaGoN";

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

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

Ihre Anwendung wählt das Standardgebietsschema. Wenn also jemand Ihre Anwendung auf Türkisch mit Türkischgebietsschema ausführt, wird i ohne Punkt angezeigt

5
alaster

In Kotlin

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

Wenn Sie diese Funktion zum Prüfen einer Zeichenfolge verwenden (z. B. Suchen), können Sie die Zeichenfolgen in Klein- oder Großbuchstaben zur Überprüfung verwenden. Sie können es so verwenden: 

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

Ich befasse mich mit dem gleichen Problem aber bei einer Suche in Listview. Ich habe diese Antwort hinzugefügt, um jemandem zu helfen, der das gleiche Problem hat.

0
Alp Altunel