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) を使用します。