То, что вы видите, это случай декомпозиции Unicode :
Символы, такие как немецкие умляуты, могут быть выражены двумя способами:
- чем большетрадиционная предварительно составленная форма в виде одного символа
ü
или - в разложенной форме в виде базового символа
u
, за которым следует комбинирующий диарез ̈_
(мне пришлось использовать подчеркивание здесь, чтобы сделатьон появляется потому, что он не должен стоять в одиночестве, это просто "зависшие точки")
Если вы получите что-то подобное, его легко конвертировать в предварительно составленную форму с помощью java.text.Normalizer
(доступно с Java 1.6):
String decomposed = "Mitgef\u0308hl";
printChars(decomposed); // Mitgefühl -- [M, i, t, g, e, f, u, ̈, h, l]
String precomposed = Normalizer.normalize(decomposed, Form.NFC);
printChars(precomposed); // Mitgefühl -- [M, i, t, g, e, f, ü, h, l]
// Normalizing with NFC again doesn't hurt:
String precomposedAgain = Normalizer.normalize(precomposed, Form.NFC);
printChars(precomposedAgain); // Mitgefühl -- [M, i, t, g, e, f, ü, h, l]
...
static void printChars(String s) {
System.out.println(s + " -- " + Arrays.toString(s.toCharArray()));
}
Как видите, применение NFC к уже предварительно составленной строке не повредит.
Примечаниечто печать String
будет выглядеть правильно на любом терминале с поддержкой Unicode, только если вы печатаете массив символов, вы видите разницу между разложенной и предварительно составленной формой.
Возможным источником может быть MacOS, который стремитсяхотя для кодирования вещей в разложенном виде любопытно, что Flickr не нормализует эти вещи.