2

テキストを分解しようとしています。ここからの例: http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

  U+00C1    LATIN CAPITAL LETTER A WITH ACUTE (Á)

または 2 つの別個の文字として (「分解された」形式):

  U+0041    LATIN CAPITAL LETTER A
  U+0301    COMBINING ACUTE ACCENT

Oracle のこのチュートリアル ページをフォローしています: http://docs.oracle.com/javase/tutorial/i18n/text/normalizerapi.html

この単純なケースは私にはうまくいきません:

  • 元の言葉:"schön"
  • NFC:"schön"
  • NFD:"scho\u0308n"
  • NFKC:"schön"
  • NFKD:"scho\u0308n"

上記のすべての場合、関数Normalizer.normalize("schön", form)(フォームは 、 などのいずれかNormalizer.Form.NFC)Normalizer.Form.NFDで、結果は同じです。"schön"

このコードは、Eclipse JDT で使用する Linux 上の Oracle JDK 1.6 または 1.7 インストールでは機能しません。

String n = Normalizer.normalize("schön", Normalizer.Form.NFD);

結果nは常に「schön」です。

この「問題」は、(1)この機能を完全に誤解している、または(2)悪い環境のいずれかのようなにおいがします。ハマった。助言がありますか?私のシステム設定は、かなりバニラです。

4

2 に答える 2

3

クレジットは @R.MartinhoFernandes によるものです。結果が入力と正統的に同等になることを知りませんでした。今日、Unicode の de/composition について新しいことを学びました。

要するに:

String.valueOf('Á').equals(String.valueOf('\u00C1'))
String.valueOf('A').equals(String.valueOf('\u0041'))

と:

Normalizer.normalize("Á", Normalizer.Form.NFD).equals("\u0041\u0301")
!String.valueOf('Á').equals("\u0041\u0301")

しかし:

System.out.println("Á\u0041\u0301")

印刷します:

ÁÁ
于 2013-07-25T13:53:24.697 に答える
1

これを行うだけで、仕事ができます:

String n = Normalizer.normalize("schön", Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
于 2015-11-04T08:56:50.287 に答える