Javaネタばっかり書いている元Javaプログラマ村上です。
今回は大文字⇔小文字変換に関する内容です。
Javaで大文字小文字変換する時はこんな感じですよね?
1 2 |
"HOGE".toLowerCase(); // 小文字変換 "hoge".toUpperCase(); // 大文字変換 |
これを利用して全て小文字で構成されている文字列かどうか判断する時は
1 2 3 4 5 |
if (val.equals(val.toLowerCase())) { // 正常処理 } else { // エラー処理 } |
ただこれがある環境ではうまいこと動かないんです。
それは、中央アジア全体やモンゴル高原以西にあるアルタイ山脈を中心に東ヨーロッパから北アジアに至る広大な地域です。
つまり、String#toLowerCase()やString#toUpperCase()はロケール依存するってことです。
東ヨーロッパのトルコのロケールでアルファベット「I」の小文字変換をしてみると
1 2 |
Locale lo = new Locale("tr"); System.out.println("I".toLowerCase(lo)); // 「i」ではなく「ı」が出力 |
「i」の上のポチがなくなってます。
これがトルコの「i」らしいです。
ちなみに「I」は「İ」でポチが出現しました。
変換の4パターンを実行してみました。
1 2 3 4 5 |
Locale locale = new Locale("tr"); System.out.println("I".toLowerCase(locale )); // 大文字 ⇒ 小文字 「ı」 System.out.println("I".toUpperCase(locale )); // 大文字 ⇒ 大文字 「I」 System.out.println("i".toUpperCase(locale )); // 小文字 ⇒ 大文字 「İ」 System.out.println("i".toLowerCase(locale )); // 小文字 ⇒ 大文字 「i」 |
大文字 ⇒ 大文字、小文字 ⇒ 小文字では変換は行われないみたいですね。
このような変換が行われるアルファベットと言語を調べてみました。
アルファベットは大文字小文字、言語は139言語で行いました。
するとトルコ語以外にアゼルバイジャン語もトルコ語と同じ変換になりました。
あと、Javaのコードを見るとこんなコードが
1 |
boolean localeDependent = (lang == "tr" || lang == "az" || lang == "lt"); |
trはトルコ
azはアゼルバイジャン
ltはリトアニアでした。
でもリトアニアの変換はうまくいってたんですけどね。謎。。。。
ちなみにJavaScriptではtoLowerCase()とtoLocaleLowerCase()が用意されていて、
ロケールがトルコの場合、toLocaleLowerCase()は「ı」を返すようです。
国際化対応っていろいろと難しそうですね。