2012-03-21 18 views
7

My Raylar 3.2.2/Yakut 1.9.3 uygulama gibi arama isteklerini alır:Ruby karakter kodlamasını belirleyin 1.9.3

http://booko.com.au/books/search?q=Fran%E7ois+Vergniolle+de+Chantal 

Yakut/Raylar bu sorguyu alır ve bunu deşifre - ama UTF-var varsayar 8.

q="Fran%E7ois+Vergniolle+de+Chantal" 
=> "Fran%E7ois+Vergniolle+de+Chantal" 

CGI.unescape(q) 
=> "Fran\xE7ois Vergniolle de Chantal" 

CGI.unescape(q).encoding.name 
=> "UTF-8" 

CGI.unescape(q).valid_encoding? 
=> false 

bu başa doğru yolu nedir:

invalid byte sequence in UTF-8 
app/models/product.rb:694:in `upcase' 

Ben böyle bir şey yaptığını düşünüyorum: Bir noktada ben olsun? Doğru kodlamaya dönüştürmek istiyorum - ancak mevcut kodlamayı nasıl belirleyebilirim?

q = q.unpack('C*').pack('U*') 

bunlarla başa doğru yolu nedir: Bir yerde blogda buldum

q.encode!("ISO-8859-1", "UTF-8", :invalid => :replace, :undef => :replace, :replace => "") 

Veya yapıyor şey: Şu anda yapıyor o ki, üstleniyor o LATIN1 var?

Düzenleme sunucusunun doğru "Content-Type: text/html; charset = utf-8" gönderiyor başlığını müşteriye. Sayfa ayrıca uygun meta etiketi içerir: 'meta http-equiv = "içerik türü" content = "text/html; charset = UTF-8"'

İstemciye hangi kodlamaları bildirmenin başka bir yöntemi olup olmadığından emin değilsiniz. kullanmak?

+0

"App/models/product.rb" nin üstünde "# kodlama: UTF-8" yazacak olursanız ne olur? Bu hatayı çözmesi gerektiğini düşünüyorum. Bu çözümden memnun kalacak mısınız? – ck3g

+0

@ ck3g, nope, burada dosya kodlamasıyla ilgili değil. – fl00r

+0

Doğru bayıltmayı belirlemek için bir çeşit sözlük kullanmanız gerekir; çünkü aynı 0x10 parametresi, Latin1 dışındaki kodlamalarda geçerli bir karakter olabilir (ve aslında). –

cevap

5

Karakter ç, URL'de% E7 olarak kodlanmıştır. ISO-8859-1 bu şekilde ç kodlar. ISO-8859-1 karakter kümesi, tek bir bayt ile bir karakteri temsil eder. Ç yi temsil eden bayt, E7 olarak heks halinde ifade edilebilir.

Unicode'da ç'nin U + 00E7 kod noktası vardır. Kod noktasının (E7) kodlama ile aynı olduğu ISO-8859-1'den farklı olarak (hex'te E7) Unicode, UTF-8, UTF-16 ve UTF-32 gibi çoklu kodlama şemalarına sahiptir. UTF-8, U + 00E7 (ç) yi iki bayt - C3 A7 olarak kodlar. Kodlamak için diğer yollar için bkz.

ISO-8859-1'deki U + 00E7 ve E7'nin her ikisi de "E7" yi kullanırken, Unicode'daki ilk 256 kod noktası ISO-8859-1 ile aynı şekilde yapılmıştır.

Bu URL UTF-8 ise, ç% C3% A7 olarak kodlanır. Benim (çok sınırlı) RFC2616 anlayışım, bir URL için varsayılan kodlamanın (şu anda) ISO-8859-1 olmasıdır. Bu nedenle, bu büyük olasılıkla ISO-8859-1 kodlu URL'dir.(Artı bir İşte

unless query.valid_encoding? 
    query.encode!("UTF-8", "ISO-8859-1", :invalid => :replace, :undef => :replace, :replace => "") 
end 

IRB süreç şöyledir: Hangi en iyi yaklaşım, değilse kodlama geçerlidir ve kontrol ISO-8859-1 olduğunu varsayalım ve UTF-8'e dönüştürecektir için muhtemelen demektir eğlencenin sonunda kaçmak için)

a = CGI.unescape("%E7") 
=> "\xE7" 
a.encoding 
=> #<Encoding:UTF-8> 
a.valid_encoding? 
=> false 
b = a.encode("UTF-8", "ISO-8859-1") # From ISO-8859-1 -> UTF-8 
=> "ç" 
b.encoding 
=> #<Encoding:UTF-8> 
CGI.escape(b) 
=> "%C3%A7" 
0

URL kodlanmış bir dize gibi görünüyor. Burada referans için kodlanmış karakterlerin bir listesi: http://www.degraeve.com/reference/urlencoding.php

Maalesef CGI kütüphanesi utf-8 ile ilgili sorunlar vardır ve çıkış yapılmış yöntemleri boşluk gibi bazı karakterler ile iyi çalışır, eğer başkaları ile iyi çalışmaz.

require'cgi' 
a = "Fran%E7ois+Vergniolle+de+Chantal" 
a= a.gsub('+', ' ').gsub('%E7','ç') 
puts a 
=> François Vergniolle de Chantal 

a = "Fran%E7ois+Vergniolle+de+Chantal" 
a = CGI::unescape(a) 
puts a 
=> Franis Vergniolle de Chantal 

Belki de kendi yönteminizi gsub ve kodlanmış karakterlerin listesini kullanarak uygulayabilirsiniz?

+0

Hangi sorunlara başvurursunuz? http://ideone.com/hWnj6 –

+0

@ MladenJablanović, dizge UTF-8 ise, latin1'e force_encode yapıp sonra UTF-8'e kodlamanız gerekmiyor mu? Her iki karakter kümesinde% E7 cedilla ile küçük bir C olduğundan beri? Daha fazla okuma,% C3% A7'nin bu karakter için UTF-8 yerine% E7 yerine doğru kodlama olabileceğini düşündürür. – dkam

+0

@Mladen Jablanović –

İlgili konular