java.text.Normalizer: isNormalized() возвращает false, но Normalize не изменяет строку
Я только начал узнавать о 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));
}
}
Так что, если ничего не помогает, я могу использовать это. Но ради любопытства, что случилось с Нормализатором?
2 ответа
Это означает, что Normalizer.isNormalized вернул false
Нет, это означает, что Normalizer.isNormalized вернул true
, Перечитайте ваш код. Может быть, вы имели в виду
if (b == true) {
когда ты написал
if (b == false) {
U+2013
(en-dash) и U+002D
(знак минус) - это два разных символа Unicode, а не два разных представления одного и того же символа. Таким образом, нормализация не превращает первое во второе.
Кроме того, "\u2013"
уже нормализовано, и isNormalized()
оценивается в true
в вашем коде.