10

辞書編集的に同等であるがバイトレベルでは同一ではない 2 つの Java 文字列を比較する方法を探しています。

より正確には、次のファイル名「baaaé.png」を取得します。バイト レベルでは、2 つの異なる方法で表すことができます。

[98, 97, 97, 97, -61, -87 , 46, 112, 110, 103] --> "é" は 2 バイトでエンコードされます

[98, 97, 97, 97, 101, -52, -127 , 46, 112, 110, 103] --> "é" は 3 バイトでエンコードされます

    byte[] ch = {98, 97, 97, 97, -61, -87, 46, 112, 110, 103};
    byte[] ff = {98, 97, 97, 97, 101, -52, -127, 46, 112, 110, 103};

    String st = new String(ch,"UTF-8");
    String st2 = new String(ff,"UTF-8");
    System.out.println(st);
    System.out.println(st2);
    System.out.println(st.equals(st2));

次の出力が生成されます。

baaaé.png
baaaé.png
false

equals メソッドが true を返すように比較する方法はありますか?

4

2 に答える 2

8

Collat​​orクラスを適切な強度で使用して、さまざまなアクセント記号などを正規化できます。これにより、文字列を正常に比較できます。

この場合、文字列を等しくするには、US ロケールと TERTIARY 強度で十分です。

Collator usCollator = Collator.getInstance();
usCollator.setStrength(Collator.TERTIARY);
System.out.println(usCollator.equals(st, st2));

出力

true

Java のNormalizerクラスを使用して、異なる形式の Unicode 間で変換することもできます。これにより文字列が変換されますが、最終的には同じになるため、標準の文字列ツールを使用して比較を行うことができます

最後に、さまざまな方法で Unicode 文字列を操作するための多くのツールを提供するICU (International Components for Unicode) プロジェクトを見てみましょう。

于 2013-01-23T19:42:06.407 に答える
7

調べる必要がある 2 種類のUnicode 正規化形式があります。

最初の 1 つは、NFC 対 NFD です。質問で挙げた例は、NFC と NFD の違いの優れた例です。最初の文字列は NFC で、2 番目の文字列は NFD です。

Unicode では、多くのアクセント付き文字を 2 つの異なる方法で表すことができます。ベース文字の後に結合アクセントが続く方法、または構成済みのアクセント付き文字としてです。NFC は、使用可能な場合、構成済みの文字を使用します。NFD は常に分解された形式を使用します。

通常、NFC と NFD を組み合わせて使用​​することはありません。ほとんどの環境では、どちらが優先される形式であるかが指定されています。簡単に言うと、MacOS X のファイル名は NFD を使用し、それ以外のほとんどすべては NFC を使用します。しかし、「その他の」正規化形式の入力が与えられた場合は、簡単に変換できます。プロセスは単純で (Unicode 文字データベースによって提供される情報を使用)、ロスレスです (つまり、NFC 間を行ったり来たりすることができます)。必要に応じて、情報を失うことなく NFD を使用できます)。

java は、文字列を特定の Unicode 形式に変換できるNormalizerという組み込みクラスを提供します。

他に、NFKC と NFKD の 2 つの正規化形式があります。これらの形式は、一般的な使用を意図したものではなく、辞書式の比較のみを目的としています。これらは、たとえば、¼ は検索または比較において 1/4 と同じと見なされるべきであるという事実を説明しています。しかし、これらは ¼ と 1/4 が同じであることや、一方を他方に変換する必要があることを意味するものではありません。

NFC から NFKC への変換、および NFD から NFKD への変換も簡単ですが (文字データベースが必要です)、今回は損失が大きくなります。元の NFC/NFD テキストを保持し、NFKC/NFKD を検索/ソート キーとしてのみ使用する必要があります。

于 2013-01-23T19:44:33.663 に答える