2012-10-18 31 views
32

kodlamadan UTF-8'e zorla Raylarım uygulamasında dünyanın her yerinden RSS beslemeleriyle çalışıyorum ve bazı yayınlarda UTF-8'de olmayan bağlantılar var. Orijinal feed bağlantıları kontrolümün dışında ve uygulamanın diğer bölümlerinde kullanmak için UTF-8'de olması gerekiyor.Kodları

Kodlamayı nasıl algılayabilir ve UTF-8'e nasıl dönüştürebilirim?

+0

bir kodlama tespit etmek için geçerli bir UTF-8 dizesi olduğunu ne olursa olsun sağlayacaktır

, sen belgelerin ekli meta bilgileri ayrıştırmak gerekir, yani HTTP başlıkları veya '' etiketleri. – deceze

cevap

48

dönüştürmek istedik:

Eğer bir dönüşüm gerçekleştirmek istiyorsanız
str = str.force_encoding("UTF-8") 

str.encoding.name # => 'UTF-8' 

, encode kullanın:

begin 
    str.encode("UTF-8") 
rescue Encoding::UndefinedConversionError 
    # ... 
end 

Kesinlikle daha fazla bilgi için aşağıdaki yazıyı okurdum:
http://graysoftinc.com/character-encodings/ruby-19s-string

+0

Cevabınız için teşekkürler, makale de iyi bir okumaydı. –

+0

Çalışmıyor: whois = whois.force_encoding ("UTF-8") \ n whois.encoding.name => "UTF-8" \ n whois.scan (/ role: \ s + (. +)/i) - Atar: ArgumentError: UTF-8 – Hackeron

+0

'da geçersiz bayt dizisi Belirtildiği gibi, force_encoding karakterleri dönüştürmez ve kesinlikle geçersiz UTF-8 bayt dizilerini sihirli olarak yorumlayamaz. – kwarrick

4

Iconv

require 'iconv' 
i = Iconv.new('UTF-8','LATIN1') 
a_with_hat = i.iconv("\xc2") 

Özet: iconv mücevher kodlamalar dönüştürme tüm çalışır. emin ile yüklü olun: Şimdi

gem install iconv 

, kendi dize kodlayan Ruby (. Hiçbir içsel kodlamasıyla) bayt bir dizi olarak 1.8 davranır Strings Örneğin olarak şu anda bilmemiz gerekiyor, dize olduğunu söylemek Latin1 ile ve sadece kodlamasını değiştirmek ancak karakterleri dönüştürmek olmaz, bir kodlama kolaydır "zorlamak"

Yakut 1.9 utf-8

require 'iconv' 

string_in_utf8_encoding = Iconv.conv("UTF8", "LATIN1", string_in_latin1_encoding) 
+0

Cevabınız için teşekkürler, fakat benim durumumda kaynak veriler tutarsız ve kodlamaları önleme konusunda güvenilir bir yolum yok aslında –

+4

Iconv artık kullanılmamalıdır. (kullanımdan kaldırıldı) http://stackoverflow.com/questions/8148762/iconv-deprecation-warning-with-ruby-1-9-3 – basgys

21

Bu doğru kodlamayı ve sağlayacaktır herhangi bir geçersiz veya tanımsız karakteri boş bir dizeyle değiştirdiği için hata yapmaz. Bu

str.encode(Encoding.find('UTF-8'), {invalid: :replace, undef: :replace, replace: ''})