83

文字列内のすべての文字を Java で大文字または小文字に変換するコードが必要でした。

次のような方法を見つけました。

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

今、トルコ語のような特定の s を使用すると、「 i (ドットあり)の代わりにi (Localeドットなし)が返される」ことを読みました。

LocaleUK、US、ENGLISH などの sを使用しても安全ですか? 文字列に適用した場合、それらの間に大きな違いはありますか?

sに最も適しているのはどれLocaleですか?String

4

6 に答える 6

79

locale を使用する必要があると思います。

たとえば、トルコ語ロケールの "TITLE".toLowerCase() は "tıtle" を返します。ここで、"ı" は LATIN SMALL LETTER DOTLESS I 文字です。ロケールに依存しない文字列で正しい結果を得るには、toLowerCase(Locale.ENGLISH) を使用します。

これらのリンクを問題の解決策として参照します。「トルコ語」の状況で留意すべき点があります。

**FROM THE LINKS**

toLowerCase() は国際化 (i18n) を尊重します。Locale に関して大文字と小文字の変換を実行します。toLowerCase() を呼び出すと、内部的に toLowerCase(Locale.getDefault()) が呼び出されます。ロケールに依存するため、ロケールを個別に解釈するロジックを記述しないでください。

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

上記のプログラムで、変換前後の文字列の長さを見てください。1と3になります。はい、大文字小文字変換前後で文字列の長さが違います。このシナリオで文字列の長さに依存すると、ロジックはトスになります。プログラムが異なる環境で実行されると、失敗する可能性があります。これは、コード レビューの良いキャッチになります。

より安全にするために、別のメソッド toLowerCase(Locale.English) を使用して、ロケールを常に英語にオーバーライドすることができます。しかし、あなたは国際化されていません。

重要なのは、 toLowerCase() がロケール固有であることです。

参考1
参考2
参考3


dotless-i は、ドットのない小文字の 'i' です。この文字の大文字は通常の「I」です。もう1文字「I with dot」があります。この文字の小文字は、通常の小文字の「i」です。

問題に気づきましたか?この非対称変換は、プログラミングで重大な問題を引き起こします。toLowerCase および toUpperCase 関数の (IMHO) 実装が不十分なため、主に Java アプリケーションでこの問題に直面します。

Java では、String.toLowerCase() メソッドは、デフォルトのロケールに従って文字を小文字に変換します。これは、アプリケーションがトルコ語ロケールで動作する場合、特に特定の文字セットに従わなければならないファイル名または URL にこの関数を使用している場合に問題を引き起こします。

名前に「i」が含まれるスクリプト ライブラリのコンパイル エラーと、XPage が名前に「I」を含むデータベースにある場合の XSP Manager の障害です。

おっしゃる通り、長い歴史があります。たとえば、一部の R7 バージョンでは、受信者の名前が「I」で始まる場合、ルーターは受信者にメッセージを送信できませんでした。メッセージ レポート エージェントは、R8 までトルコ語ロケールで実行されていませんでした。トルコ語ロケールのユーザーは、Lotus Notes 8.5.1 をインストールできませんでした (これは本物です!)。リストは続きます...

トルコのベータ テスターはほとんどおらず、顧客はこれらの問題のために PMR を開きません。したがって、これらの問題は開発チームの最優先事項にはなりません。

Java チームでさえ、最新のドキュメントに特別な警告を追加しました。

このメソッドはロケールに依存するため、ロケールを個別に解釈することを意図した文字列に使用すると、予期しない結果が生じる可能性があります。例としては、プログラミング言語識別子、プロトコル キー、および HTML タグがあります。たとえば、トルコ語ロケールの "TITLE".toLowerCase() は "tıtle" を返します。ここで、"ı" は LATIN SMALL LETTER DOTLESS I 文字です。ロケールに依存しない文字列で正しい結果を得るには、toLowerCase(Locale.ENGLISH) を使用します。

于 2012-06-16T11:51:05.457 に答える
6
String str = "CyBeRdRaGoN";

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

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

アプリケーションはデフォルトのロケールを選択するため、誰かがアプリケーションをトルコ語でトルコ語ロケールで実行すると、iドットなしで表示されます

于 2012-06-16T11:45:16.847 に答える
0

コトリンで

private fun changelowertoupper(): String {
        val str = "CyBeRdRaGoN"
        return str.lowercase()
    }
于 2019-09-04T17:03:53.103 に答える