libxml преобразует символы с акцентом в обратную косую черту x. Джсон не счастлив - PullRequest
2 голосов
/ 27 января 2010

У меня есть следующий атрибут в узле xml, который я читаю с помощью libxml. Он обычно печатается с акцентированным символом, если я распечатываю reader.node.

reader = XML::Reader.new(File.open("somefile.xml", "r"))
reader.read
reader.read
...
p reader.node

=> ... Full_Name="Univisión Network - East Feed" ...

Однако, если я сделаю это, то получится сбежавшим.

p reader.node["Full_Name"]
=> "Univisi\xC3\xB3n Network - East Feed"

И когда я пытаюсь преобразовать это значение в json laater, я получаю следующую ошибку.

Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8

Вот строка XML в документе

<?xml version="1.0" encoding="ISO-8859-1"?>

У меня нет контроля над самим документом xml. Как я могу вернуть этот символ юникода обратно в json или в формат, который понимает json?

РЕДАКТИРОВАТЬ : О, я забыл упомянуть - вот как это выглядит в настоящем документе XML

Full_Name="Univisi&#243;n Network - East Feed" 

Ответы [ 3 ]

1 голос
/ 28 января 2010

Итак, я до сих пор совершенно не понимаю, почему не могу найти «правильный» способ сделать это, но этот поток помог найти метод force_encoding в классе String. , Так как мой код в любом случае включает в себя копирование атрибутов в хеш, то нет ничего страшного в том, чтобы вызвать force_encoding, когда я копирую значение.

Я вдвойне убедился, что сохранил файл как UTF-8, и поместил правильную декларацию xml вверху. Это все еще не удалось.

В любом случае, до тех пор, пока я не смогу понять, как исправить реальную проблему, этот код исправил ее.

  object = { type: node.name }      
  node.attributes.each do |attribute|
    name = attribute.name.gsub /_/,""
    value = attribute.value.force_encoding('UTF-8')

    object[name] = value
  end

Обратите внимание, что это было бы неуместно, если бы мне уже не нужно было копировать узел в хеш, поскольку это определенно не стоило бы всех хлопот. Если я тогда сделаю

object.to_json

Работает без проблем. Спасибо за вашу помощь, топор! У вас есть идеи, как я могу форсировать кодировку в XML?

0 голосов
/ 27 января 2010

EDIT
так что я пытался понять это уже довольно давно. Самое смешное: ваш код работает без ошибок в ruby ​​1.8 (по крайней мере, здесь). так что я думаю, что ошибка связана с новой обработкой кодировки ruby ​​1.9. каким-то образом он не может понять, что проанализированный и прочитанный XML находится в (libxml внутреннем) формате utf-8 (здесь не имеет значения кодировка документа: в 1.8 он работает как с iso-8859-1, так и с utf-8, даже с неправильное объявление кодировки xml). вместо этого он обрабатывает его как ASCII-8BIT или BINARY. другими словами, он не знает кодировку. вот почему to_json не удается преобразовать его в utf-8.

Самый простой способ решить эту проблему - понизить рейтинг до ruby ​​1.8.

альтернативно, ваш подход force_encoding('UTF-8') кажется разумным.
РЕДАКТИРОВАТЬ КОНЕЦ

вы можете попробовать передать правильную кодировку читателю:

reader = XML::Reader.new(File.open("somefile.xml", "r"), 
  XML::Encoding::ISO_8859_1)
0 голосов
/ 27 января 2010

Однако, если он это сделает, он сбежит.

Не совсем.То, что вы видите, - это вывод UTF-8, интерпретируемый как строка байтов.

Проблема в том, что ваш XML-документ говорит , что это ISO-8859-1, хотя это действительно UTF-8.Исправьте проблемы с кодировкой, и она должна работать.

...