【问题标题】:Get difference between two character codes in Ruby获取Ruby中两个字符代码之间的区别
【发布时间】:2016-08-15 09:58:27
【问题描述】:

虽然它可能不可读,但我希望有人能告诉我是否有可能 - 如果有的话如何 - 使以下代码工作

true if (string1 - string2) == predefined_distance

我希望这可能使用 Ruby 的 Open Classes 来实现,但是查看 UTF-8 和 Encoder::Converter 的文档我不确定是否真的可以做除 <=> 之外的任何事情,这不是一点都不精确。也许我们可以转换为 ASCII 并比较这些值?

一个使用示例可能是比较两个左括号,看看它们是否匹配,而不是为每种类型的括号定义单独的列表或容器,而是我们可以为任意两个任意字符定义一个距离。

【问题讨论】:

  • 不知道为什么这个问题被否决了。很好。我赞成抵消。
  • SO 往往是一个充满敌意的地方,所以谢谢!
  • 各种括号类型之间的 UTF-8/ASCII 距离不是恒定的,例如() 的距离为 1,而 [] 的距离为 2。

标签: ruby utf-8 ascii


【解决方案1】:

String类的内置方法ord可以返回字符的个数:

true if (string1.chars.first.ord - string2.chars.first.ord) == predefined_distance 

http://ruby-doc.org/core-2.2.0/String.html#method-i-ord

【讨论】:

  • 谢谢!在 String 文档中没有看到这个方法,抱歉!
  • 你可以写string1.ord而不是string1.chars.first.ord
【解决方案2】:

你想完成什么?你真的只是想检查字符串中的第一个字符吗?此外,关于 ASCII 值,世界上有许多不使用 ASCII 的字符集,甚至每个字符需要多个字节。因此,确保您对字符而不是字节进行操作非常重要。这是一个在 irb 中使用日语“ruby”一词的示例:

2.3.0 :018 > s = 'ルビー'
 => "ルビー"
2.3.0 :019 > s.chars
 => ["ル", "ビ", "ー"]
2.3.0 :020 > s.chars.size
 => 3
2.3.0 :021 > s.bytes
 => [227, 131, 171, 227, 131, 147, 227, 131, 188]
2.3.0 :022 > s.bytes.size
 => 9
2.3.0 :023 > s.chars.first.ord.to_s(16)
 => "30eb"

【讨论】:

    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多