试图了解Ruby .chr和.ord方法

最近我一直在使用Ruby chrord方法,并且有一些我不明白的东西。

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

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

'好'.ord

我得到了22909这个角色的位置。但是,如果我在该值上调用chr

22909.chr

“RangeError:22909超出了字符范围。” 我只能够得到char以处理最多255的值,这是扩展的ASCII。 所以我的问题是:

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

  • 根据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
    

    经过一段时间的工作之后,我意识到我可以通过运行二进制搜索来查找不会引发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
    

    提供给该方法的值是正在检查的编码的名称。

    链接地址: http://www.djcxy.com/p/34769.html

    上一篇: Trying to understand the Ruby .chr and .ord methods

    下一篇: How to make LINQ