У меня есть проблема, которую я считал тривиальной. Мне приходится иметь дело с умляутами из немецкого алфавита (äöü
). В Юникоде вроде бы есть несколько способов их отображения, один из них — комбинирование символов. Мне нужно нормализовать эти разные способы, заменить их все односимвольным кодом.
Такой девиантный умлаут легко найти: это буква aou
, за которой следует символ UTF-8 \uCC88
. Поэтому я подумал, что регулярного выражения будет достаточно.
Это моя функция преобразования, использующая пакет Encoding
.
# This sub can be extended to include more conversions
sub convert {
local $_;
$_ = shift;
$_ = encode( "utf-8", $_ );
s/u\xcc\x88/ü/g;
s/a\xcc\x88/ä/g;
s/o\xcc\x88/ö/g;
s/U\xcc\x88/Ü/g;
s/A\xcc\x88/Ä/g;
s/O\xcc\x88/Ö/g;
return $_;
}
Но получившийся напечатанный умлаут представляет собой какой-то еще более коварный символ (теперь он занимает 4 байта), а не тот, что в этом список.
Я предполагаю, что проблема заключается в этом жонглировании внутренним форматом Perl, фактическим UTF-8 и этим форматом кодирования.
Даже изменение строк замены на
s/u\xcc\x88/\xc3\xbc/g;
s/a\xcc\x88/\xc3\xa4/g;
s/o\xcc\x88/\xc3\xb6/g;
s/U\xcc\x88/\xc3\x9c/g;
s/A\xcc\x88/\xc3\x84/g;
s/O\xcc\x88/\xc3\x96/g;
не помогло, они конвертируются правильно, но затем в байтах следует "\xC2\xA4".
Любая помощь?