Ruby 输出 Unicode 字符

Posted

技术标签:

【中文标题】Ruby 输出 Unicode 字符【英文标题】:Ruby Output Unicode Character 【发布时间】:2013-08-31 19:23:14 【问题描述】:

我不是 Ruby 开发人员,但我使用 Capistrano 进行 php 部署。我正在尝试清理脚本的输出并尝试添加unicode check mark,如this blog 中所述。

问题是如果我这样做:

checkmark = "\u2713"
puts checkmark

它输出“\u2713”而不是✓

我在 Google 上四处搜索,但找不到任何讨论这个问题的地方。

TLDR:我如何 putsprint unicode 复选标记 U-2713?

编辑


我在我的 Mac (OSX Lion) 上运行 Ruby 1.8.7,因此无法使用 encode 方法。我的 shell 是 iTerm2 中的 Bash。


更新 [2019 年 4 月 8 日] 添加了参考图片,以防网站出现故障。

【问题讨论】:

【参考方案1】:

在 Ruby 1.9.x+ 中

使用String#encode:

checkmark = "\u2713"
puts checkmark.encode('utf-8')

打印

在 Ruby 1.8.7 中

puts '\u2713'.gsub(/\\u[\da-f]4/i)  |m| [m[-4..-1].to_i(16)].pack('U') 
✓

【讨论】:

我应该提到我有 Ruby 1.8.7,显然 encode 方法直到 1.9 才可用。 1.9之前是怎么做的? @cilosis,我添加了 Ruby 1.8.7 兼容版本。您应该使用 '\u2713'"\\u2713",因为在 ruby​​ 1.8 中是 "\u2713" == "u2713" 嘭!我首先尝试了您的解决方案,但它不起作用。然后转到单引号,它起作用了!谢谢:) 我能够简单地执行checkmark = "\u2713".encode('utf-8'); puts checkmark 之类的操作,因此将编码保存到变量中。这在 Ruby 2.2.2 中适用于我。 @Lori, "\u1f3e0" ('1f3e0' == 127968.to_s(16))【参考方案2】:

falsetru 的回答不正确。

checkmark = "\u2713"
puts checkmark.encode('utf-8')

这会将复选标记从当前系统编码转码为 UTF-8 编码。 (这只适用于默认已经是 UTF-8 的系统。)

正确答案是:

puts checkmark.force_encoding('utf-8')

这会修改字符串的编码,而不修改任何字符序列。

【讨论】:

【参考方案3】:

在较新版本的 Ruby 中,您不需要强制编码。这是2.1.2 的示例:

2.1.2 :002 > "\u00BD"
 => "½"

请确保使用双引号!

【讨论】:

这条关于确保使用双引号的评论救了我——我正忙着弄清楚为什么这不起作用!【参考方案4】:

作为附加说明,如果你想打印一个表情符号,你必须用大括号括起来。

irb(main):001:0> "\u1F600"
=> "?"

【讨论】:

不错,但似乎不适用于字符串插值a=1F600; puts "\u#a"【参考方案5】:

在 ERB 中与上述相同,不需要强制编码,完美运行,在 Ruby 2.3.0 测试

    <%= "\u00BD" %>

非常感谢

【讨论】:

【参考方案6】:

我们如何在新版本的 ruby​​ 中按原样打印

复选标记 = "\u2713" 打勾

这应该按原样打印 \u2713

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Ruby 输出 Unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

清理 URL slug 的 Unicode 字符串(Ruby/Rails)

在Ruby中通过十六进制字符串获取unicode [重复]

在Ruby 1.8/1.9中获取字符串的unicode字符

ruby 更改Rails 3.2.13和4.0如何在JSONMonkey修补程序ActiveSupport中编码unicode以恢复to_json unicode字符编码。

使用 Unicode 排序算法在 Ruby 中排序

中文字符替换为其unicode编码值小3的字符