【问题标题】:Rails 3.2.21 / ruby 1.9.3 how can I \u encode unicode chars within a stringRails 3.2.21 / ruby​​ 1.9.3 我如何\u在字符串中编码unicode字符
【发布时间】:2015-03-15 11:08:32
【问题描述】:

我需要清理一些发送到不支持收件人名称中的 unicode 的电子邮件服务提供商 (Sendgrid) 的文本,除非它被 \u 转义。

当 UTF-8 字符串 s = "Pablö" 时,我如何“\u 转义”字符串中的任何 unicode,以便得到 "Pabl\u00f6"

转换为 JSON 也会转义引号(我不想要):

"Pablö".to_json
=> "\"Pabl\\u00f6\""

我正在寻找的是类似于 .force_encoding('binary') 的东西,但 Unicode 除外。检查 Encoding.aliases.values.uniq 我没有看到类似“unicode”的东西。

【问题讨论】:

    标签: ruby string unicode unicode-escapes


    【解决方案1】:

    我将假设一切都是 UTF-8,因为我们不是一起敲打岩石的穴居人。

    to_json 不是 escaping 引号,它是在字符串中 添加 引号(因为 JSON 需要引用字符串)然后 inspect 转义它们(和反斜杠)。

    to_json 中的这些引用应该始终存在,因此您可以将它们去掉:

    "Pablö".to_json[1..-2] # Lots of ways to do this...
    => "Pabl\\u00f6"
    

    但请记住,to_json 和 UTF-8 的行为取决于您使用的 JSON 库以及可能的其他因素。例如,在我的 Ruby 2.2 中,标准 JSON 库只保留 UTF-8; JSON 规范对 UTF-8 非常满意,那么为什么还要对它进行编码呢?所以你可能想自己做这样的事情:

    s.chars.map { |c| c.ord > 127 ? '\u%.4x' % c.ord : c }.join
    

    127 以上的任何内容都超出了 ASCII 范围,因此简单的 ord 测试可以处理 öñµ 等任何内容...如果出现以下情况,您需要调整 map 块您需要对其他字符进行编码(例如\n)。

    【讨论】:

    • 那些例子都转义了\(例如“\\u....”而不是“\u....”,gsub('\\','\') 不是允许,因为 \ 仍然被视为逃避......有什么想法吗?
    • @jpwynn 你确定他们被逃脱了吗?您可能只是被inspect 输出所迷惑,请尝试使用puts 查看编码字符串。
    猜你喜欢
    • 2013-07-02
    • 2015-08-25
    • 2012-04-05
    • 2010-11-06
    • 2016-07-06
    • 2012-06-22
    • 2017-02-20
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多