尝试理解Ruby中的.chr和.ord方法

10

最近我一直在使用Ruby的chrord方法,但有一些事情我不理解。

我的当前项目涉及将单个字符转换为序号值以及反过来。据我所知,如果我有一个带有单个字符(如“A”)的字符串,并在其上调用ord,我将获得它在ASCII表上的位置,即65。调用反向方法65.chr将给出字符值“A”,因此这告诉我Ruby中有一个有序的字符值集合,它可以使用此集合来给出特定字符的位置或特定位置处的字符。如果我错了,请纠正我。

现在我也明白Ruby的默认字符编码使用UTF-8,因此它可以处理数千种可能的字符。因此,如果我请求像这样的东西:

'好'.ord

我获得了该字符的位置,其值为22909。但是,如果我在该值上调用chr函数:

22909.chr

我得到了"RangeError: 22909 超出字符范围."的错误。 我只能在扩展ASCII值为255的情况下使用char。所以我的问题是:

  • Ruby为什么似乎从扩展ASCII字符集获取chr值,而从UTF-8获取ord值?
  • 是否有任何方法可以告诉Ruby在使用这些方法时使用不同的编码方式?例如,告诉它使用ASCII-8BIT编码而不是默认的编码方式?
  • 如果可以更改默认编码方式,是否有办法获取正在使用的字符集中可用字符的总数?

7
http://apidock.com/ruby/Integer/chr提到,你可以使用类似``22909.chr(Encoding::UTF_8)``的语法。如果你愿意,你也可以使用编码``Encoding::ASCII_8BIT``。 - Nabeel
@NabeelAmjad 你应该把那个作为答案发布。 - Jordan Running
这非常有帮助,我之前没有看到过这个,这让我离目标更近了。现在,我唯一缺少的是一种简单的方法来获取特定编码可用字符的数量。例如,ASCII_8BIT有256个字符,UTF_8约有110万个等等。是的,请将其发布为答案。 - Jonathon Nordquist
1
作为一个答案发布,我不确定如何获取可用字符的数量,虽然我查看了文档,但没有找到任何信息。 - Nabeel
欢迎来到 SO。我建议阅读 "[ask]" 及其相关页面。这些链接非常有用,可以帮助您理解如何提问。 - the Tin Man
2个回答

6
根据 Integer#chr,您可以使用以下方法强制编码为UTF_8。
22909.chr(Encoding::UTF_8)
#=> "好"

列出所有可用的编码名称
Encoding.name_list
#=> ["ASCII-8BIT", "UTF-8", "US-ASCII", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "UTF-16", "UTF-32", ...]

获取最大字符数的折中方法
2000000.times.reduce(0) do |x, i|
  begin
    i.chr(Encoding::UTF_8)
    x += 1
  rescue
  end

  x
end
#=> 1112064

非常好,谢谢。我本来担心我得尝试类似的方法才能获得最大字符数。虽然并不美观,但我们得利用手头的资源,对吧?干杯,老兄。 - Jonathon Nordquist

0

在研究了一段时间后,我意识到可以通过运行二分查找来获取每种编码的最大字符数,以找到不会抛出RangeError的最高值。

def get_highest_value(set)
  max = 10000000000
  min = 0
  guess = 5000000000

  while true
    begin guess.chr(set)
      if (min > max)
        return max
      else
        min = guess + 1
        guess = (max + min) / 2
      end
    rescue
      if min > max
        return max
      else
        max = guess - 1
        guess = (max + min) / 2
      end
    end
  end
end

传递给该方法的值是要检查的编码名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接