什么';在Ruby中,chr()的反面是什么?
在许多语言中都有一对函数,什么';在Ruby中,chr()的反面是什么?,ruby,ascii,Ruby,Ascii,在许多语言中都有一对函数,chr()和ord(),它们在数字和字符值之间进行转换。在某些语言中,ord()称为asc() Ruby具有Integer#chr,非常有效: >> 65.chr A 很公平。但是你怎么走另一条路呢 "A".each_byte do |byte| puts byte end 印刷品: 65 这和我想要的非常接近。但我真的宁愿避免循环——我正在寻找一些足够短的东西,以便在声明常量时可读,如何 放?一个 尝试: 此外,如果字符串中包含字符,并且希望在
chr()
和ord()
,它们在数字和字符值之间进行转换。在某些语言中,ord()
称为asc()
Ruby具有Integer#chr
,非常有效:
>> 65.chr
A
很公平。但是你怎么走另一条路呢
"A".each_byte do |byte|
puts byte
end
印刷品:
65
这和我想要的非常接近。但我真的宁愿避免循环——我正在寻找一些足够短的东西,以便在声明常量时可读,如何
放?一个
尝试:
此外,如果字符串中包含字符,并且希望在不使用循环的情况下对其进行解码:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
在Ruby 1.8系列之前(包括1.8系列)的版本中,以下两个版本都将生成65(对于ASCII):
Ruby1.9中的行为已经改变,上面两个都将生成“A”。在Ruby 1.9中实现这一点的正确方法是:
'A'[0].ord
不幸的是,Ruby 1.8中不存在ord
方法。我想+1 dylanfm和AShelly的评论,但添加[0]:
“A”。解包(“C”)[0]
解包调用返回一个包含单个整数的数组,在需要整数的情况下并不总是接受该数组:
$ ruby -e 'printf("0x%02X\n", "A".unpack("C"))'
-e:1:in `printf': can't convert Array into Integer (TypeError)
from -e:1
$ ruby -e 'printf("0x%02X\n", "A".unpack("C")[0])'
0x41
$
$ruby-e'printf(“0x%02X\n”,“A”.unpack(“C”)”
-e:1:在“printf”中:无法将数组转换为整数(TypeError)
from-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的字符有符号的平台上)。如果字符串ord在1.9中不存在,它在2.0中也存在:
"A".ord #=> 65
你可以有这些:
65.chr.ord
'a'.ord.chr
在通过RFCs组装纯Ruby版本的Stringprep时遇到了这个问题
请注意,chr
在[0255]之外发生故障,请改用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)>
如果您不介意从数组中提取值,可以使用“A”.bytes
我正在为1.8.6和1.9.3编写代码,但我无法在这两种环境中都使用这些解决方案:(
然而,我遇到了另一个解决方案:
这对我也不起作用,但我根据自己的需要进行了调整:
除非“.”响应(:ord)
类Fixnum
德福
回归自我
结束
结束
结束
现在Ruby 1.9已经改变了“A”[0]的含义,这是一种更具可移植性的方法。不幸的是Ruby 1.9中的“正确”方法太长了,但至少在搜索“ord”时会更容易显示出来。感谢您非常详细的回答。当用户18096编写他们的答案时,“A”。解包(“C”)[0]
,目标是Ruby 1.8.1、Ruby 1.8.7和Ruby 1.9.2。它在您的环境中失败了吗?什么样的失败?嗨,RJHunter,我正在尝试将字符串中的特定字符转换为其数值。以下代码在1.9.3中有效,但在1.8.6中无效。self.status=tagAccountString[4]。解包('C')[0]
在1.8.6中,我获得了0:Fixnum处理主缓冲标记数据的未定义异常方法
解包-退出`以下代码(使用我建议的解决方案)在两种环境中都有效self.status=tagAccountString[4]。ord
任何建议(例如更好的解决方案)非常受欢迎tagAccountString[4]
在较新的Rubies中返回字符串,但在Ruby 1.8中用于返回Fixnum。这就是为什么您看到错误,未定义的方法unpack for 0:Fixnum
。您可以使用status=tagAccountString[4,1]。unpack('C')[0]
甚至status,=tagAccountString.unpack('xxxxC'))
如果您总是想忽略四个字符并转换下一个字符。感谢RJHunter的解释和替代解决方案。但是,由于“我的”解决方案更具可读性和可重用性,我将坚持使用它(除非有充分的理由不这样做?)谢谢,这似乎是唯一一个正确给出unicode情况下的char
及其反义词的答案
65.chr.ord
'a'.ord.chr
[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)>