java.text.Normalizer:isNormalized()返回false,但Normalize不会更改字符串

时间:2013-03-29 18:15:09

标签: java unicode normalization unicode-normalization

我刚开始学习java.text.Normalizer。这看起来非常简单。我有一个“奇怪的”破折号(特别是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()的输出是“Boo!规范化的怪异破折号没有改变”

怎么可能?这意味着Normalizer.isNormalized返回false,但是在同一个字符串上调用normalize()(使用相同的Normalizer.Form)并没有改变它。

我错过了什么吗?

修改 此方法输出“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));
    }
}

所以,如果一切都失败了,我可以用它。但出于好奇心的缘故,使用Normalizer会怎么样?

2 个答案:

答案 0 :(得分:1)

  

这意味着Normalizer.isNormalized返回false

不,这意味着Normalizer.isNormalized返回true。重新阅读您的代码。也许你的意思是

if (b == true) {

当你写了

if (b == false) {

答案 1 :(得分:0)

U+2013(简称)和U+002D(减号)是两个不同的Unicode字符,不是两个不同的同一字符表示。因此,归一化不会将第一个改变为第二个。

此外,"\u2013"已经规范化,isNormalized()已在您的代码中评估为true