Rails 3.2.21 / ruby 1.9.3 如何在字符串中编码 unicode 字符

Rails 3.2.21 / ruby 1.9.3 how can I \u encode unicode chars within a string

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

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

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

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

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

之类的东西

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

to_json 不是 转义 引号,它是 在字符串中添加 引号(因为 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 测试会处理 öñµ、...如果您需要编码其他字符(例如 \n),您将需要调整 map 块。