Ruby不会将有效的UTF-8写入文件?

时间:2013-01-23 14:51:51

标签: ruby encoding jruby

我们使用CMS,在编码时使用它真的很痛苦,但我仍然需要为它生成一个结构。

我将:Encoding.default_internal设置为UTF-8,我尝试使用# Encoding: UTF-8并使用File.open("filename", "w:UTF-8")编写了文件,但我总是这样:

DOMDocument::loadXML() [domdocument.loadxml]: Input is not proper UTF-8, indicate encoding ! Bytes: 0xF6 0x6A 0xE4 0x6B in Entity, line: 7DOMDocument::loadXML() [domdocument.loadxml]: Empty string supplied as input

该文件包含öäü,如果我将其删除,则会按预期工作。

如果我使用Notepad ++功能“转换为没有BOM的UTF-8”并在其中手动编写“Umlaute(öäü)”,它就可以工作。

将值更改为ö等HTML实体是不可取的,因为它们会以这种方式出现在后端。

PS:用JRuby写的。

1 个答案:

答案 0 :(得分:0)

你没有说你是如何修改XML的,但是如果你用正则表达式和gsub进行修改,那么你就是在疯狂地行走。

我强烈建议使用XML解析器/生成器来修改XML。 XML是一个严格的规范,特别是在处理非ASCII字符时,一个好的解析器/生成器会在插入文本时考虑到这些内容。

例如,使用Nokogiri

# encoding: utf-8

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<root>
  <atextnode>content</atextnode>
</root>
EOT

atextnode = doc.at('atextnode')
atextnode.content = "öäü"
puts doc.to_xml

输出:

<?xml version="1.0"?>
<root>
  <atextnode>&#xF6;&#xE4;&#xFC;</atextnode>
</root>

将输出编码更改为UTF-8:

puts doc.to_xml(encoding: 'UTF-8')

输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <atextnode>öäü</atextnode>
</root>