Как я могу преобразовать 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]";
}
Таким образом, полученная строка будет иметь те же байтовые данные, что и исходная строка.
РЕДАКТИРОВАТЬ: немного не в тему ОП... извините.