Невозможно кодировать в кодировку iso-8859-1 для некоторых символов с помощью модуля Perl Encode - PullRequest
1 голос
/ 03 июня 2010

У меня есть HTML-строка в кодировке ISO-8859-1. Мне нужно передать эту строку в HTML: Entities :: decode_entities () для преобразования некоторых кодов HTML ASCII в соответствующие символы. Для этого я использую модуль HTML :: Parser :: Entities 3.65, но после операции decode_entities () вся моя строка меняется на строку utf-8. Такое поведение выглядит хорошо, как документация HTML :: Parse. Поскольку мне нужна эта строка обратно в формате ISO-8859-1 для дальнейшей обработки, поэтому я использовал Encode :: encode ("iso-8859-1", $ str), чтобы изменить строку обратно на кодировку ISO-8859-1. Мои результаты - отличные исключения для некоторых символов, вместо них стоит знак вопроса. Одним из примеров является код ASCII с одинарными кавычками (& rsquo;)

Кто-нибудь может мне помочь, если есть какие-либо ограничения модуля Encode? Любой другой указатель также поможет решить проблему. Я вставляю образец текста с символом, вызывающим проблему:

my $str = "This is a test string to test the encoding of some chars like ’ “ ” etc these are failing to encode; some of them which encode correctly are é « etc.";

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Существует третий аргумент для encode, который управляет проверкой, которую он выполняет. По умолчанию используется символ подстановки, но вы можете установить его на FB_CROAK, чтобы получить сообщение об ошибке.

1 голос
/ 03 июня 2010

Основная проблема заключается в том, что символы, представленные ’, “ и ”, не существуют в ISO-8859-1 . Вам нужно решить, что вы хотите с ними делать.

Некоторые возможности:

Используйте cp1252 , «расширенную» версию Microsoft ISO-8859-1 вместо реальной. Он включает в себя эти символы.

Перекодировать объекты за пределами диапазона ISO-8859-1 (плюс &) перед преобразованием из utf-8 в ISO-8859-1:

my $toEncode = do { no warnings 'utf8'; "&\x{0100}-\x{10FFFF}" };
$string = HTML::Entities::encode_entities($string, $toEncode);

(бит no warnings необходим, потому что U + 10FFFF фактически еще не назначен.)

Есть и другие возможности. Это действительно зависит от того, чего вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...