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

Jon*_*ist 8 ruby encoding

我最近一直在使用Ruby chrord方法,有些事情我不明白.

我当前的项目涉及将单个字符转换为序数值.据我所知,如果我有一个字符串,其中有一个单独的字符,如"A",我调用ord它,我得到它在ASCII表上的位置是65.调用逆,65.chr给我字符值"A",所以这告诉我Ruby有一个有序字符值的集合,它可以使用这个集合来给我一个特定字符的位置,或者特定位置的字符.我可能错了,请纠正我,如果我.

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

'?'.ord
Run Code Online (Sandbox Code Playgroud)

我得到那个字符的位置是22909.但是,如果我调用chr该值:

22909.chr
Run Code Online (Sandbox Code Playgroud)

我得到"RangeError:22909超出char范围." 我只能char处理最大为255的值,即扩展的ASCII.所以我的问题是:

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

Nab*_*eel 6

根据Integer#chr您可以使用以下内容强制编码为UTF_8。

\n\n
22909.chr(Encoding::UTF_8)\n#=> "\xe5\xa5\xbd"\n
Run Code Online (Sandbox Code Playgroud)\n\n

列出所有可用的编码名称

\n\n
Encoding.name_list\n#=> ["ASCII-8BIT", "UTF-8", "US-ASCII", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "UTF-16", "UTF-32", ...]\n
Run Code Online (Sandbox Code Playgroud)\n\n

获取最大字符数的一种巧妙方法

\n\n
2000000.times.reduce(0) do |x, i|\n  begin\n    i.chr(Encoding::UTF_8)\n    x += 1\n  rescue\n  end\n\n  x\nend\n#=> 1112064\n
Run Code Online (Sandbox Code Playgroud)\n