2011-06-23 11 views
5

mam pewne treści (HTML), który jest zakodowany jako skutek tego JavaScript (od this page) i wysyłane do mojej aplikacji szyn:ruby ​​/ rails równoważne javascript decodeURIComponent?

function encode_utf8_b64(string) { 
return window.btoa(unescape(encodeURIComponent(string))); 
} 

The odpowiadać js kod aby otrzymać go z powrotem do oryginału jest taka:

function decode_utf8_b64(string) { 
return decodeURIComponent(escape(window.atob(string))); 
} 

Moje pytanie brzmi, czy istnieje odpowiednik w rubinach decodeURIComponent()? Do tej pory mam to, że staje się ona częścią drogi wyjścia, ale brakuje mi ostatni etap decodeURIComponent:

CGI::escape(Base64.decode64(string)) 

Odpowiedz

12

URI.unescape prawdopodobnie mógłby pomóc:

def decode_utf8_b64(string) 
    URI.unescape(CGI::escape(Base64.decode64(string))) 
end 

trzeba dodać niezbędne rubygem też:

require 'uri' 

Testowałem to na Rubim 1.9.2.

+0

thx, zaktualizowałem odpowiedź :) – olistik

+0

dzięki - gdy stosuję URI.unescape lub URI.decode, pojawia się błąd "nieprawidłowy bajt sekwencji w UTF-8". Wydaje się, że wyjście CGI :: escape() to US-ASCII. Kiedy próbowałem użyć Iconv, aby przekonwertować ciąg znaków na UTF-8 przed zastosowaniem URI.unescape, przestał on wyrzucać błąd, ale wydawał się po prostu usunąć jeden z etapów deencoding, więc wynik był nadal bałagan. Jakieś wskazówki? A może to jest osobny problem. – bobfet1