Как я могу преобразовать XML-документ из Latin-1 в UTF-8 в Perl?

Мы в компании хотим конвертировать все сайты, которые мы размещаем, с Latin-1 на UTF-8. После многих поисков мы почти завершили наш Perl-скрипт. Единственное, чего сейчас не хватает - это файлов XML.

Каков наилучший способ конвертировать XML из Latin-1 в UTF-8 и является ли он полезным?

Я спрашиваю, потому что мы не уверены в этом, так как большинство записей в Google объясняют, как сделать прямо противоположное. Некоторые даже говорят, что utf8 может вызвать проблемы с XML. Не могли бы вы рассказать нам о проблеме кодирования XML?

3 ответа

Решение

Что вы конвертируете? Данные или теги XML или что-то еще?

Я думаю, вам просто нужно прочитать это как Latin-1 и переписать как UTF-8, если ваш источник не делает что-то действительно странное. Декодирование и кодирование происходит для вас на уровне файлового дескриптора. Как только у вас есть это в Perl, это уже внутренне UTF-8.

Что у тебя до сих пор? Какие у вас проблемы?

Ваша ситуация слишком сложна, чтобы просто использовать xmllint?

 xmllint --encode utf8 --output filename.xml filename.xml.latin1

Если вы используете XML::Parser, см. Юрико-совет Джерда об этом модуле.

Если вы конвертируете не только XML-файлы, iconv может помочь:

iconv -f ISO-8859-1 -t UTF-8 filename.txt.latin1 > filename.txt

Я бы использовал xmllint --encode utf8 FILE-NAME, образец:

xmllint --encode utf8 --output test.xml test.xml

будет правильно конвертировать test.xml (независимо от того, какая кодировка может иметь) в UTF-8, включая пролог XML.

Как Брайан упомянул его внутри UTF-8 в Perl. Perl преобразует это, хотите вы этого или нет.

Хитрость связана с флагом UTF8, который является битовым флагом, прикрепленным к каждой строке. Для данных, которые возвращает XML::Parser, устанавливается флаг UTF8.

Если вы когда-нибудь захотите избавиться от этого поведения, снимите флаг UTF8. Один из способов сделать это можно так:

sub de_utf8 {
    use bytes;
    return "$_[0]";
}

Таким образом, полученная строка будет иметь те же байтовые данные, что и исходная строка.

РЕДАКТИРОВАТЬ: немного не в тему ОП... извините.

Другие вопросы по тегам