【问题标题】:Ruby on Rails: UTF-8 encoding string that has %F1 in contentRuby on Rails:内容中包含 %F1 的 UTF-8 编码字符串
【发布时间】:2014-03-10 00:12:57
【问题描述】:

我正在努力在 Rails 中找到可以将 UTF-8 代码转换为其可显示值的正确方法。

在我的例子中,如果可能的话,它会将一些用户输入(如“John%20Da%F1e”)转换为“John Dañe”。

目前,我有以下内容:

unescaped_name = CGI::unescape(params[:name]) # this turns "John%20Da%F1e" into "John Da\xF1e"
@q = I18n.transliterate(unescaped_q) #this yields an 'invalid byte sequence in UTF-8' error

本质上,我正在尝试从“John%20Da%F1e”(已经以 UTF-8 编码)到“John Dañe”。

我尝试过的一件事是

.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')

但这会将 ascii(% 到 \x)替换为“John Dae”。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 utf-8


    【解决方案1】:

    你需要告诉 Ruby 被解析的字符串 应该 的编码是什么。看起来您从 ('ISO-8859-1') 开始使用 Latin-1。有几种不同的选择。如果您想将此决定限制为您正在处理的字符串,您可以像这样使用.force_encoding

    require 'cgi'
    unescaped_name = CGI::unescape( "John%20Da%F1e" ).force_encoding('ISO-8859-1')
    #  => "John Da\xF1e"
    unescaped_name.encode('UTF-8')
    #  => "John Dañe"
    

    请注意,一旦编码设置正确,它已经包含正确的字符,但在将其转换为可以显示的编码之前,您不一定会看到。所以我在哪里显示 "John Da\xF1e" 只是因为我的终端设置为显示 UTF-8 - \xF1ñ 在 Latin-1 编码中的字节。


    据我所知,单个步骤中同一字符串的 UTF-8 字节的 URI 编码如下所示:

    "John%20Da%C3%B1e"
    CGI::unescape( "John%20Da%C3%B1e" )
    #  => "John Dañe"
    

    【讨论】:

    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多