2016-06-14 105 views
7

最近我一直在使用Ruby chrord方法,但有一些内容我不明白。试图了解Ruby .chr和.ord方法

我目前的项目涉及将单个字符转换为序数值和从序数值转换。据我了解,如果我有一个字符串与个人字符,如“A”,我打电话ord我得到它的位置在65的ASCII表格。调用相反,65.chr给我的字符值“A”,所以这告诉我Ruby有一个集合在有序字符值的地方,它可以使用这个集合给我一个特定字符的位置,或者在特定位置的字符。我可能是错的,请纠正我,如果我。

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

'好'.ord 

我得到这个角色是22909.不过的位置,如果我叫chr该值:

22909.chr 

我得到“的RangeError: 22909 out of char range。“我只能得到char以处理扩展ASCII的255值。所以我的问题是:

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

http://apidock.com/ruby/Integer/chr提到你可以使用像''22909.chr(Encoding :: UTF_8)''。如果你想使用它,编码也有''Encoding :: ASCII_8BIT''。 –

+0

@NabeelAmjad您应该将其作为答案发布。 –

+0

这是非常有用的,我没有看到,这让我走了很长的路要走到哪里。现在,我唯一缺少的就是获取可用于特定编码的字符数的简单方法。例如ASCII_8BIT有256个字符,UTF_8约为1。100万等。是的,请张贴它作为答案。 –

回答

3

根据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 
+0

非常好,谢谢。我担心我不得不尝试类似的方式来获得最大字符数。不漂亮,但我们用我们的产品进行工作,对吧? 干杯队友。 –

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 

馈送给该方法的值是要检查的编码的名称。