2011-06-23 76 views
5

Tôi có một số nội dung (html) đang được mã hóa như một kết quả của javascript này (từ this page) và gửi đến đường ray ứng dụng của tôi:ruby ​​/ ray tương đương với javascript decodeURIComponent?

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

Các tương ứng js mã để có được nó trở lại ban đầu là thế này:

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

Câu hỏi của tôi là, có tương đương với ruby ​​của decodeURIComponent() không? Cho đến nay tôi có điều này mà được nó là một phần của lối thoát, nhưng tôi là thiếu bước cuối cùng của decodeURIComponent:

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

Trả lời

12

URI.unescape có thể có thể giúp:

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

bạn phải thêm cần thiết rubygem quá:

require 'uri' 

Tôi đã thử nghiệm điều này trên ruby ​​1.9.2.

+0

thx, tôi đã cập nhật câu trả lời :) – olistik

+0

cảm ơn - khi tôi áp dụng URI.unescape hoặc URI.decode, tôi nhận được lỗi "chuỗi byte không hợp lệ trong UTF-8". Dường như đầu ra của CGI :: escape() là US-ASCII. Khi tôi cố gắng sử dụng Iconv để chuyển đổi chuỗi thành UTF-8 trước khi áp dụng URI.unescape, nó ngừng ném lỗi nhưng dường như chỉ loại bỏ một trong các bước deencoding để đầu ra vẫn là một mớ hỗn độn. Có lời khuyên nào không? Hoặc có thể đây là một vấn đề riêng biệt. – bobfet1

Các vấn đề liên quan