2010-07-01 43 views
10

ile karakter kodlamasını dönüştürme, amazon api sonuçlarıyla şu anda sorun yaşıyorum. (Seri öğrenin) Mac üzerinde Amaç \ XE2'de \ x80 \ x93C bilgi dize bile işlenmemiştir olabilir yakut 1.9.1 ileruby ​​1.9

:

hizmet unicode karakterleri ile bir dize döndürür

REXML::ParseException: #<Encoding::CompatibilityError: incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)> 

... 

Exception parsing 

Line: 1 

Position: 1636 

Last 80 unconsumed characters: 

Learn Objective–C on the Mac (Learn Series) 
+2

I yüksek * Mutlak Asgari Her Yazılım Geliştirici Kesinlikle, olumlu Unicode ve Karakter Kümeleri hakkında bilmeniz gereken okumanızı tavsiye (No Bahaneler!) * (http://www.joelonsoftware.com/articles/Unicode.html), zaten olsanız bile fa kodlamalar ve benzeri ile miliar. – ewall

+2

ı Geçenlerde 1.9 içinde kodlaması hakkında yehuda Katz'ın makaleyi okuyun ve düşünce: WTF ?! (http://yehudakatz.com/2010/05/17/encodings-unabridged/) Bağladığınız makale mükemmel. – phoet

cevap

29

İstisna noktaları olarak dizginiz ASCII-8BIT kodludur. Kodlamayı değiştirmelisiniz. Orada bu konuda bir long story, ama sadece force_encoding ipte, hızlı bir çözüm ilgilenen eğer herhangi bir işleme yapmadan önce:

s = "Learn Objective\xE2\x80\x93C on the Mac" 
# => "Learn Objective\xE2\x80\x93C on the Mac" 
s.encoding 
# => #<Encoding:ASCII-8BIT> 
s.force_encoding 'utf-8' 
# => "Learn Objective–C on the Mac" 
+0

bu, amazon-hizmetinden gönderilen yanıtın bir sorunu mu? başka bir içerik türü koymuş olmalı mı? – phoet

+0

AWS ile çalışmadım bu yüzden bu dizenin nasıl yüklendiğini bilmiyorum, ancak (Ruby) uygulama düzeyinde varsayılan kodlamayı ayarlayabiliyorsunuz, bu yüzden bu sorunu çözme şansı olacak - daha fazla bağlantı cevap. BTW, Yakut basitçe yok (ve olmamalıdır) o alıyor dize kodlayan halinde olduğu tahmin etmeye çalışın, bir _issue_ hiç yoktur sanmıyorum –

+0

Muhtemelen.; Bu HTTParty'nin buna dikkat etmesi gerektiği anlamına gelir. –

25
ASCII 8bit olarak kodlanmıştır her şey aslında dönüştürülebilir eğer Mladen'in çözüm çalışır

doğrudan UTF-8'e. 1) geçersiz, veya 2) UTF-8'de tanımlanmamış karakterler olduğunda kırılır. Ancak, bu (1.9.2 ve yukarı çalışacaktır. Düzgün geçersiz ve tanımsız karakterler ile uğraşırken

new_str = s.encode('utf-8', 'binary', :invalid => :replace, 
    :undef => :replace, :replace => '') 

ASCII 8bit etkili bir ikili olan bu kod, UTF-8'e kodlamasını dönüştürür. Geçersiz seçenek geçersiz karakterlerin değiştirileceğini belirtir: undef seçeneği undefined karakterlerin değiştirileceğini belirtir ..: replace (değiştir) seçeneği geçersiz veya tanımsız karakterlerin değiştirilmesi gerektiğini tanımlar.Bu durumda, basitçe bunları kaldırmayı seçtim:

+0

Ah, güzel görünüyor! bunu deneyecek! – phoet

+0

': fallback' mekanizmasını denediniz mi? u için u00E4 gibi bazı 'windows-1252' kodlamaları değiştirmeyi denedim ama işe yaramadı :( – phoet

+0

Bu sadece gönderim için bir HTTP gövdesine bir dosya akışı yaparken benim için gün kurtardı ... Çok teşekkürler! +1 – stuartc

İlgili konular