2013-01-23 17 views
0

我們使用CMS,這對於編碼來說是一種真正的痛苦,但我仍然需要爲它生成一個結構。Ruby不會將有效的UTF-8寫入文件?

我設置: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 

該文件包含öäü,並且,如果刪除它們,它像預期的那樣工作。

如果我使用記事本++函數「轉換爲UTF-8不帶BOM」並手動寫入「Umlaute(öäü)」,它就可以工作。

將值更改爲像ö這樣的HTML實體是沒有選擇的,因爲它們會以這種方式出現在後端。 PS:它是用JRuby編寫的。

+0

您的XML文件在標題行上是否具有正確的編碼?<?xml version =「1.0」encoding =「UTF-8」?> –

+0

是的,我忘了提及這一點。我甚至不生成XML我只是複製一個工作的默認「模板」,並替換標題 – b1nary

+0

如何替換標題?替換後XML可能會被破壞嗎?您是否曾嘗試通過類似[xmllint](http://xmlsoft.org/xmllint.html)的方式運行XML來分別驗證流程和XML數據?文本是否插入到CDATA塊中,並且已將值轉換爲編碼格式,還是仍然是原始文件? –

回答

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> 
+0

當然這很酷,但該工具實際上必須處理所有類型的模板,不應僅限於XML,但也許我可以借用nokogiri的某些轉換函數^^ – b1nary

+0

Nokogiri僅解析XML和HTML。你不會得到它來解析/生成其他東西,因爲它依賴於libXML。很容易就能發現什麼類型的文件是有條件的,並且有條件地進行分支,允許Nokogiri只用於它設計的內容。 –

+0

借用我喜歡的東西,就像在我的'str.gsub('ä','ä').gsub(「ü」,'ü').gsub('ä','ö' ).force_encoding('Windows-1252')。encode(「UTF-8」)'沒有做任何事情會起作用的......另外「使用這個庫」實際上並不是我正在考慮的答案。 Nokogiri有很大的依賴。仍thx爲您的幫助 – b1nary