我刚开始学习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会怎么样?
答案 0 :(得分:1)
这意味着Normalizer.isNormalized返回false
不,这意味着Normalizer.isNormalized返回true
。重新阅读您的代码。也许你的意思是
if (b == true) {
当你写了
if (b == false) {
答案 1 :(得分:0)
U+2013
(简称)和U+002D
(减号)是两个不同的Unicode字符,不是两个不同的同一字符表示。因此,归一化不会将第一个改变为第二个。
此外,"\u2013"
已经规范化,isNormalized()
已在您的代码中评估为true
。