Nokogiri XML Builder с кириллическим текстом (windows 1251)
Я пытаюсь создать файл XML из массива. Это мой код строителя:
def buildXML(formattedText)
builder = Nokogiri::XML::Builder.new do |xml|
xml.products {
formattedText.each do |lineItem|
xml.item {
xml.articleNumber lineItem[0]
description = lineItem[1..(findIndexOnShtrih(lineItem)-1)].join(" ").force_encoding(Encoding::Windows_1251)
xml.description description
xml.shtrihCode lineItem.at(findIndexOnShtrih(lineItem))
}
end
}
end
end
Мой ввод выглядит следующим образом (он всегда содержит номер статьи по 1-му индексу, затем идет описание от 2-го до N-3 индекса, от N-2 до N-1 - сумма, а N-й индекс содержит штрих-код):
["047609", "СОК", "СВЕЖЕВЫЖАТЫЙ", "ТОМАТ", "200", "МЛ", "(фреш", "дня)", "1", "шт", "2400000032731"]["048504", "ВОДА", "ГАЗИРОВАННАЯ", "С", "НАТУРАЛЬНЫМ", "СИРОПОМ", "(200МЛ)", "1", "шт", "2400000032953"]["055794", "СОК", "СВЕЖЕВЫЖАТЫЙ", "В", "АССОРТИМЕНТЕ", "(200МЛ)", "1", "шт", "2400000036425"]["058270", "СОК", "СВЕЖЕВЫЖАТЫЙ", "КЛУБНИКА", "+ЯБЛОКО", "200", "МЛ", "(фреш", "дня)", "1", "шт", "2400000037149"]
Это приводит к таким вещам:
<articleNumber>055794</articleNumber>
<description>СОК СВЕЖЕВЫЖАТЫЙ В АССОРТИМЕНТЕ (200МЛ) 1 шт</description>
<shtrihCode>2400000036425</shtrihCode>
</item>
<item>
<articleNumber>058270</articleNumber>
<description>СОК СВЕЖЕВЫЖАТЫЙ КЛУБНИКА +ЯБЛОКО 200 МЛ (фреш дня) 1 шт</description>
<shtrihCode>2400000037149</shtrihCode>
</item>
</products>
По сути, я хочу, чтобы описание в XML показывало правильные буквы кириллицы.
Можно ли как-то заставить сборщика использовать конкретную кодировку? Я нашел много материала о том, как открыть файлы XML с определенной кодировкой, используя Nokogiri::XML(a, nil, "UTF-8")
например, но ничего о том, как создать правильный XML.
Удивительно, но если я опускаю блок кода в моем тексте, SO отображает мой текст просто отлично.
1 ответ
После нескольких часов попыток нашел этот пост - Как мне кодировать / декодировать HTML-объекты в Ruby?
Вам нужно декодировать такие значения как С
согласно этой таблице: http://webdesign.about.com/od/localization/l/blhtmlcodes-ru.htm
CGI не помог мне, но HTMLEntities сделал.
Это мой рабочий код прямо сейчас:
require 'htmlentities'
puts HTMLEntities.new.decode(buildXML(cleansedArray).to_xml)
И наконец желаемый результат:
<item>
<articleNumber>055794</articleNumber>
<description>СОК СВЕЖЕВЫЖАТЫЙ В АССОРТИМЕНТЕ (200МЛ) 1 шт</description>
<shtrihCode>2400000036425</shtrihCode>
</item>
<item>
<articleNumber>058270</articleNumber>
<description>СОК СВЕЖЕВЫЖАТЫЙ КЛУБНИКА +ЯБЛОКО 200 МЛ (фреш дня) 1 шт</description>
<shtrihCode>2400000037149</shtrihCode>
</item>
</products>