2011-09-09 4 views
27

私は、Javaで単語を大文字にすることに関する膨大な質問にすべてのStackOverflowを見てきましたが、それらのどれも国際化についてはほとんど気にしていないようです。国際的な状況で働くこと。だから私の質問です。JavaのUnicode正しいタイトルケース

私は単語を表すJavaのStringを持っています。すべてのisLetter()文字は空白ではありません。私は最初の文字を大文字にし、残りは小文字にしたい。私は便利な言葉のロケールを持っています。

文字列の最後の部分について.substring(1).toLowerCase(Locale)を呼び出すだけで十分です。 正しい最初の文字を取得する方法はわかりません。

私が持っている最初の問題はオランダ語です。ここで、 "ij"は有向グラフであり、一緒に大文字にする必要があります。私はそれを知っているので、私は手でこれを特別に扱うことができた。今私が知らないこの種のものには他の言語があるかもしれません。私がうまく言えばUnicodeが教えてくれると確信しています。しかし、私は尋ねる方法を知らない。

Characterがタイトルケースをサポートしていてロケールをサポートしていないため、Stringはロケールをサポートしていますが、タイトルケースはサポートしていないため、上記の問題が解決されても、私はまだ英語、トルコ語、

コードポイントを取得してCharacter.toTitleCase()に渡すと、このメソッドにロケールを渡す方法がないため、これは失敗します。システムロケールが英語で、単語がトルコ語で、単語の最初の文字が「i」の場合、「İ」ではなく「I」を取得しますが、これは間違っています。 サブ文字列をとり、.toUpperCase(Locale)を使用すると、タイトルケースではなく上部文字なので失敗します。だから、もしその言葉がギリシャ語であれば、私はまだ間違った性格を持つでしょう。

誰かが役に立つポインタを持っていれば、私はそれらを聞いて嬉しいです。

+0

'toTitleCase()はロケールに依存しないため、ロケールは必要ありません。 --- 2つの文字 'ij'を有向グラフにするには、有向グラフのUnicode文字'ij'(['LATIN SMALL LIGATURE IJ'(U + 0133))]に変換する必要があります(http:// www。 fileformat.info/info/unicode/char/0133/index.htm))。 – Andreas

答えて

3

問題は、大文字と小文字の区別が言語特有であることです。多くの言語、たぶんほとんどの言語にはそのようなものはありません。

とにかく、そこにUnicodeのよくある質問です: http://www.unicode.org/faq/casemap_charprop.html

は..and私は、Unicode固有のマッピングテーブルは、どこかで(そのftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txtのようなもの)があると思います。ですから、あなた自身の変換方法を使用するのが最も良いでしょう。

6

あなたのように、私はコアJava APIで適切なメソッドを見つけることができませんでした。

しかし、locale-sensitive string-title-case method (UCharacter#toTitleCase) in the ICU libraryがあるようです。関連ICU法(UCharacter#toTitleCaseUCaseProps#toUpperOrTitle)のソースを見ると


は、タイトル・ケースのための多くのロケール固有の特殊なケースがあるように思えませんので、あなたが逃げることができるかもしれません次のようになります。

  1. 文字列内の最初のケース文字を探します。
  2. 大文字の表記とは別の表題の書式がある場合は、それを使用します。
  3. それ以外の場合は、最初の文字とその結合文字にロケールセンシティブの大文字を入力します。
  4. 残りの文字列でロケールセンシティブな小文字を実行します。
  5. ロケールがオランダ語で、最初のケース文字が "I"の後に "j"、大文字の "j"である場合。
4

両方の文字が一度に大文字になり、おそらく実際の生活プログラムで遭遇する唯一の2文字文字の有向グラフは、オランダ語IJです。ロケールがオランダ語の場合は、それを処理してください。最悪の状況では、後で追加する必要があるケースは1〜2件あります。毎日新しい大文字の字句グラフが表示されるわけではありませんので、ここでは一般化に注目する価値はありません。

一般に、文字から文字への変換を使用して、任意の言語のタイトルまたは大文字を取得することはできません。小文字の中には、複数の大文字に変換するものがあります。したがって、一般的な場合にStringを使用する必要があります。

タイトルケースのロケールに問題はありません。おそらく、ToTitleCase()メソッドがどのように動作するかについての小さな誤解があります。タイトルケースの文字に変換されます(既に大文字になっています)。

たとえば、dž文字を考えます。

System.out.println(Character.toUpperCase('\u01C4')); 
DŽ 

としかし

System.out.println(Character.toTitleCase('\u01C4')); 
Dž 

、次のようにも与えるタイトルケース

System.out.println(Character.toTitleCase(Character.toUpperCase('\u01C4'))); 
Dž 

ので:それは大文字フォームがDŽで、タイトルケースの形がDžありますあなたが大文字小文字の前にロケールで大文字に変換すると、正しいコードポイントが得られ、problはありませんEMは、その上部ケースとの違いは、一般的なケースでは正しくありませんされている場合だけ単一文字のタイトルケースを使用して、トルコ語、等:

System.out.println(Character.toTitleCase("dž".toUpperCase().charAt(0))); 
System.out.println(Character.toTitleCase("i".toUpperCase(Locale.forLanguageTag("tr")).charAt(0))); 
Dž 
İ 

注意を含め、結果にタイトルケースを使用します。

を要約すると:

  • ハンドルオランダ有向グラフ(あるいは他の二重字をあなたがそれらが発生した場合、私は非常にそれを疑うし、最悪の場合には、プログラムの寿命のために1〜2例となります)。
  • ロケールとtoUpperCase()を使用して文字列として必要な文字を変換します。
  • toUpperCaseの結果のすべての文字をCharacter toTitleCaseに変換します。

注意は、まだアイルランドの接頭辞のように、単に文字/文字列処理よりも多くを必要とするなど、英語FF名、コンテキスト認識している一部の時価総額の例があるが、私はあなたがタイトルのためにそれらを処理する必要が疑いますプログラムでの世代。

関連する問題