2010-12-30 5 views
3

entkommen Also habe ich diese UTF-8-String in einer XML-Datei bekam:Converting XML-Entitäten zurück in UTF-8

Horrible place. ☠☠☠ 

Und wenn ich es an eine externe Anwendung füttern, kommen die lustigen Charaktere zurück entkommen als XML-Entitäten:

Horrible place. ☠☠☠ 

In Ruby, wie konvertiere ich diese Zeichenfolge zurück zu UTF-8? Es gibt wahrscheinlich eine wirklich einfache Lösung dafür, aber ich kann nichts in den Standardbibliotheken finden; z.B. CGI.unescapeHTML (die gut für Dinge wie > funktionieren) scheinen sie vollständig zu ignorieren.

ree-1.8.7-2010.02 > CGI.unescapeHTML('>') 
=> ">" 
ree-1.8.7-2010.02 > CGI.unescapeHTML('☠') 
=> "☠" 

Antwort

4

Nun, da es XML ist codiert ich für einen XML-Parser gehen würde:

require 'nokogiri' 

frag = 'Horrible place. ☠☠☠' 
doc = Nokogiri::XML.fragment(frag) 
puts doc.text 
# >> Horrible place. ☠☠☠ 
+0

Brilliant, danke! Ich rief 'doc.to_xml' an, das die Entitäten behielt. – jpatokal

+0

Ja, weil 'to_xml' eine XML-Repräsentation erzeugt. –

2

CGI.unescapeHTML funktioniert gut; Die Konsole, die Sie verwenden, ist möglicherweise nicht in der Lage, das Unicode-Zeichen anzuzeigen.

Versuchen Sie dies und es sollte funktionieren:

File.open("d:\\11.txt", 'w') {|f| f.write(CGI.unescapeHTML('☠')) } # => ☠ 
+0

Ist für mich nicht funktioniert, sagt der Datei "& # x2620;" und teilt die Ausgabezeichenfolge in Bytes: 'CGI.unescapeHTML ('& # x2620;'). bytes.each {| b | print "# {b}"} => 38 35 120 50 54 50 48 59'. Dies ist in Rails 2.3, welche Version verwenden Sie? – jpatokal

+0

Das ist komisch. Ich habe Ruby 1.8.7 (2010-08-16 Patchlevel 302) [i386-mingw32] verwendet. – Zabba