-1

について学び始めたばかりjava.text.Normalizerです。それはかなり簡単に思えました。対処する「奇妙な」ダッシュの1つがあります(特にU+2013

通常のダッシュ文字に変換したいので、簡単なテスト コードをいくつか作成しました。

import java.text.Normalizer;

public class Test {
public static void main(String[] args) {
    String weirdDash = "–";
    String normalDash = "-";

    boolean b = Normalizer.isNormalized(weirdDash, Normalizer.Form.NFD);
    if(b == false) {
        System.out.println("Java thinks the weird dash is normal");
        return;
    }
    String normalizedWeirdDash = Normalizer.normalize(weirdDash, Normalizer.Form.NFD);

    if(normalizedWeirdDash.equals(normalDash)) {
        System.out.println("Yay!");
    } else {
        System.out.println("Boo! normalized weird dash "+(normalizedWeirdDash.equals(weirdDash) ? "didn't change" : "= " + normalizedWeirdDash));
    }
}
}

main() の出力は「ブー! 正規化された奇妙なダッシュは変更されませんでした」です。

そんなことがあるものか?これは、Normalizer.isNormalized が false を返したことを意味しますが、同じ文字列 (同じ Normalizer.Form を使用) に対して normalize() を呼び出しても、まったく変更されませんでした。

私は何か見落としてますか?

EDIT このメソッドは「true」を出力します。

public class Test {
    public static void main(String[] args) {
        String weirdDash = "–";
        String normalDash = "-";
        String newDash = weirdDash.replaceAll("(\\\u2013)", "-");
        System.out.println(newDash.equals(normalDash));
    }
}

それで、他のすべてが失敗した場合、私はこれを使用できます。しかし、好奇心のためにノーマライザーはどうしたのでしょうか?

4

2 に答える 2

1

Normalizer.isNormalized が false を返したことを意味します

いいえ、それは Normalizer.isNormalized が返されたことを意味しtrueます。コードを読み直してください。多分あなたは意味した

if (b == true) {

あなたが書いたとき

if (b == false) {
于 2013-03-29T18:23:35.610 に答える
0

U+2013(en-dash) とU+002D(マイナス記号) は 2 つの異なる Unicode 文字であり、同じ文字の 2 つの異なる表現ではありません。したがって、正規化によって最初のものが 2 番目に変更されることはありません。

その上、"\u2013"すでに正規化されており、コードでisNormalized()評価さtrueれます。

于 2013-03-29T18:26:23.503 に答える