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 в вашем коде.

Другие вопросы по тегам