Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Ruby中,chr()的反面是什么?_Ruby_Ascii - Fatal编程技术网

什么';在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)>