У меня есть база данных текстовых документов разумного размера, в основном сохраненная в формате 8859, которые были собраны через веб-форму (с использованием скриптов Perl). До недавнего времени я согласовывал обычные 1252 символа (фигурные кавычки, апострофы и т. Д.) С простым набором регулярных выражений:
$line=~s/\x91/\&\#8216\;/g; # smart apostrophe left
$line=~s/\x92/\&\#8217\;/g; # smart apostrophe right
... и т. Д.
Однако, так как я решил, что должен использовать Unicode, и преобразовал все мои сценарии для чтения и вывода utf8 (который обрабатывает весь новый материал), регулярное выражение для этих (существующих) 1252 символов больше не работает и Мой вывод Perl html выводит буквально 4 символа: «\ x92», «\ x93» и т. д. (по крайней мере, так выглядит браузер в режиме utf8, загрузка (ftp не http) и открытие в текстовом редакторе (textpad) он отличается, остается один неопределенный символ, и при открытии выходного файла в Firefox по умолчанию (без заголовка типа содержимого) в режиме 8859 отображается правильный символ).
Новые прагмы utf8 в начале скрипта:
использовать CGI qw (-utf8);
используйте open IO => ': utf8';
Я понимаю, что это происходит из-за того, что режим utf8 делает символы двухбайтовыми вместо однобайтовых, и применяется к этим символам в диапазоне от 0x80 до 0xff, прочитав статью об этом, но я не был мудрым, поскольку как их фильтровать. В идеале я знаю, что мне нужно заново сохранять все документы в режиме utf8 (так как база данных плоских файлов теперь содержит смесь 8859 и utf8), однако, прежде всего, мне понадобится какой-то фильтр, если я все равно это сделаю .
И я могу ошибаться в отношении внутреннего 2-байтового хранилища, поскольку, похоже, оно подразумевает, что Perl обрабатывает вещи очень по-разному в зависимости от обстоятельств.
Если бы кто-нибудь мог предоставить мне решение для регулярных выражений, я был бы очень благодарен. Или какой-то другой метод. Я несколько недель рвал на себе волосы с различными попытками и неудачным взломом. Просто около 6 1252 символов, которые обычно нуждаются в замене, и с помощью метода фильтра я мог бы восстановить всю партию flippin в utf8 и забыть, что когда-либо было 1252 ...