Как я могу преобразовать XML-документ из Latin-1 в UTF-8 в Perl? - PullRequest
2 голосов
/ 02 ноября 2009

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

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

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

Ответы [ 3 ]

8 голосов
/ 02 ноября 2009

Что вы конвертируете? Данные или теги 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
7 голосов
/ 02 ноября 2009

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

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

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

1 голос
/ 02 ноября 2009

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

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

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

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

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

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

...