Ruby中chr()的反义词是什么?


100

在许多语言中,有一对函数chr()ord(),它们在数字和字符值之间转换。在某些语言中,ord()称为asc()

Ruby has Integer#chr,效果很好:

>> 65.chr
A

很公平。但是你怎么走呢?

"A".each_byte do |byte|
   puts byte
end

印刷品:

65

这很接近我想要的。但是我确实希望避免循环-我在寻找一个足够短的东西来声明时可读const

Answers:



33

在Ruby(包括1.8版及更高版本)中,以下代码都会产生65(对于ASCII):

puts ?A
'A'[0]

在Ruby 1.9中,行为已更改,以上两种方法都将产生“ A”。在Ruby 1.9中执行此操作的正确方法是:

'A'[0].ord

不幸的是,该ord方法在Ruby 1.8中不存在。


不幸的是,Ruby 1.9中的“正确”方式是如此之长,但至少在搜索“ ord”时它会更容易显示。感谢您的详细回答。
RJHunter

13

尝试:

'A'.unpack('c')

1
现在Ruby 1.9改变了'A'[0]的含义,这是更可移植的方法。
AShelly

10

我想+1 dylanfm和AShelly的评论,但添加[0]:

'A'.unpack('C')[0]

unpack调用返回一个包含单个整数的Array,在需要整数的地方并不总是会接受该数组:

$ ruby​​ -e'printf(“ 0x%02X \ n”,“ A” .unpack(“ C”))'
-e:1:在`printf'中:无法将Array转换为Integer(TypeError)
    来自-e:1
$ ruby​​ -e'printf(“ 0x%02X \ n”,“ A” .unpack(“ C”)[0])'
0x41
$ 

我正在尝试编写适用于Ruby 1.8.1、1.8.7和1.9.2的代码。

被编辑为以大写形式将C传递给unpack,因为unpack(“ c”)给我-1,而ord()给我255(尽管运行在对C的char进行签名的平台上)。


4

刚通过RFC将Stringprep的纯Ruby版本组合在一起时碰到了这一点。

当心chr在[0,255]之外失败的故障,请使用1.9.x-2.1.x便携式替代品:

[22] pry(main)> "\u0221".ord.chr
RangeError: 545 out of char range
from (pry):2:in 'chr'
[23] pry(main)> x = "\u0221".unpack('U')[0]
=> 545
[24] pry(main)> [x].pack('U')
=> "ȡ"
[25] pry(main)>

谢谢,这似乎是给了唯一的答案char正确,它在统一的情况下,逆
Munyari




2

如果您不介意将值从数组中拉出,则可以使用 "A".bytes


0

我正在为1.8.6和1.9.3编写代码,但我无法在所有两种环境中都能使用这些解决方案:(

但是,我遇到了另一个解决方案:http : //smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

那对我也不起作用,但我对其进行了调整以供使用:

unless "".respond_to?(:ord)
  class Fixnum
    def ord
      return self
    end
  end
end

完成此操作后,以下内容将在两种环境下均适用

'A'[0].ord


当user18096写下答案时"A".unpack("C")[0],其针对的是Ruby 1.8.1,Ruby 1.8.7和Ruby 1.9.2。它在您的环境中是否失败?什么样的失败?
RJHunter 2015年

嗨,RJHunter,我正在尝试将字符串中的特定字符转换为其数字值。以下代码在1.9.3中起作用,但在1.8.6中不起作用。 self.status = tagAccountString[4].unpack('C')[0] 在1.8.6中,我将 Exception undefined method 解压缩为0:Fixnum处理主要的缓冲标签数据-退出以下代码在两种环境下均有效(使用我建议的解决方案) self.status = tagAccountString[4].ord 任何建议(例如,更好的解决方案)都非常受欢迎
hantscolin

tagAccountString[4]在较新的Ruby中返回一个String,但在Ruby 1.8中用于返回一个Fixnum。因此,您会看到错误undefined method unpack for 0:Fixnum。您可以使用,status = tagAccountString[4,1].unpack('C')[0]或者即使status, = tagAccountString.unpack('xxxxC')您始终想忽略四个字符并转换下一个字符。
RJHunter 2015年

感谢RJHunter的解释和替代解决方案。但是,由于“我的”解决方案更具可读性和可重用性,因此我将坚持这一点(除非有充分的理由而不是?)
hantscolin 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.