ruby - 从字符串中可靠地删除 unicode 的最佳方法是什么

标签 ruby

我有多种字符串需要从中提取“TM”、“(c)”等。这些标记是 unicode 格式的。现在我只想取出所有 unicode,一旦我开始工作,我会更有选择性,只取出法律标记。这是代码:

strings = ['Star Wars \u2122 2', 'Empire Strikes Back\u00C2\u00AE The Strikening',
       "Star Wars\u2122 2", "Empire Strikes Back\u00C2\\u00AE The Strikening"]

p strings.inspect

strings.each { |str|
  sub = str.gsub(/\\(u[(\d)a-fA-F]{4})/, "")
  p sub
}

结果:

["Star Wars \\u2122 2", "Empire Strikes Back\\u00C2\\u00AE The Strikening", "Star Wars\u2122 2", "Empire Strikes Back\u00C2\\u00AE The Strikening"]
"Star Wars  2"
"Empire Strikes Back The Strikening"
"Star Wars\u2122 2"
"Empire Strikes Back\u00C2 The Strikening"

适用于单引号,但不适用于双引号。我知道单引号字符串的行为与双引号字符串不同。这里的问题是,被送入此函数的字符串表现为双引号字符串并破坏了代码(不会发生替换)。我尝试在 gsub 之前添加 sub('\\', '\\\\') 但这并没有解决问题。

我想我对字符串在 Ruby 中的行为有一些误解。如何可靠地从 "Star Wars\u2122 2" 中删除 unicode 符号?我拥有的正则表达式没有这样做。

ruby 1.9.3

最佳答案

这可能有点低效,因为它构建了一个包含其中每个字符的数组,但它可以工作(在 Ruby 1.9 和更高版本中):

s = "Empire Strikes Back\u00C2\u00AE The Strikening"
t = s.chars.select(&:ascii_only?).join    # => "Empire Strikes Back The Strikening"

当您编写 '\u00C2' 时,您并不是在创建包含 unicode 的字符串。您正在创建一个包含 5 个 ASCII 字符的字符串。当您编写 "\u00C2" 时,您正在创建一个包含单个非 ASCII unicode 字符的字符串。这是双引号和单引号之间的区别之一。

关于ruby - 从字符串中可靠地删除 unicode 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8186301/

相关文章:

ruby-on-rails - ActiveRecord 数组计数

ruby - rspec模拟与其他模拟框架的优缺点是什么?

ruby - 如何在 ruby​​ on rails 中本地化 will_paginate?

arrays - 使用 ruby​​ 以 DRY 方式提取散列中的值

ruby-on-rails - 使用事件记录查询从 postgres 数据库返回不同或分组的记录

ruby-on-rails - Rails 中的 LocalJumpError(未给出 block )

javascript - 在 Rails 上加载 WebAssembly 二进制文件

Ruby/Rails 根据每个项目的相似性对数组进行排序

ruby - 如何对 ruby​​ 中的重音单词数组进行排序

Ruby Sort_by 多个参数与 asc/desc 相反