2013-06-10 20 views
40

Hpricot kullanan bir tarayıcı yazıyorum. Bazı web sayfalarından dizelerin bir listesini indirir, sonra dosyaya yazmayı denerim. Bir şey kodlaması ile yanlıştır: bu yüzden force_encoding('UTF-8') yardımcı olmuyor,Ruby'de bir dizgi UTF8'e dönüştürme

Développement 

str.encoding döner UTF-8:

"\xC3" from ASCII-8BIT to UTF-8 

bir web sayfası üzerinde işlenen ve bu şekilde yazdırılır öğeler var. Bunu nasıl okunabilir UTF-8'e dönüştürebilirim?

+2

, Nokogiri kullanmayı düşünün: –

cevap

51

Sizin dize yanlış yol yuvarlak kodlanmış görünüyor:

"Développement".encode("iso-8859-1").force_encoding("utf-8") 
#=> "Développement" 
+0

Çoğu durum için iyi çalışır. Ancak bazen: 'CIDEM/ACC1Ã' ' 'de UTF-8'den ISO-8859-1'e U + 201C, Citi'nin Sürdürülebilir Kalkınma Yatırımlarında UTF-8'den ISO-8859-1'e U + 20AC t. Ayrıca bazı isimler dönüştürülür, ancak yanlış ve ben bir veritabanında "tamamlanmamış çok baytlı karakter" hata iletisi – ciembor

+1

ile kusuramıyorum Üzgünüz, bu bir düzeltme olarak değil. Dizeleri uygulamanıza okurken doğru kodlamayı ayarlayarak/tespit ederek sorunu çözmelisiniz. – Stefan

+0

@Stefan, harika çözüm, teşekkürler! – gaussblurinc

37

dize UTF-8 olduğunu düşünüyor gibi görünüyor, ama gerçekte, başka bir şey, muhtemelen ISO-8859-1 olduğunu.

Önce doğru kodlamayı tanımlayın (zorlayın) ve sonra UTF-8'e dönüştürün. Örnekte

:

puts "Développement".encode('iso-8859-1').encode('utf-8') 

bir alternatiftir: Ã hiç mantıklı

puts "\xC3".force_encoding('iso-8859-1').encode('utf-8') #-> Ã 

, o zaman başka bir kodlama deneyin.

hpricot artık korunur
file_contents.encode!('UTF-16', 'UTF-8')