У меня есть проблема, которую я считаю тривиальной.Мне приходится иметь дело с умлаутами из немецкого алфавита (äöü
).В Unicode, кажется, есть несколько способов их отображения, один из которых - объединение символов.Мне нужно нормализовать эти разные способы, заменить их все односимвольным кодом.
Такой девиантный умлаут легко найти: это буква aou
, за которой следует UTF-8 char \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".
Любая помощь?