为什么Ruby会将`string.chr`值转换为`?`?

为什么Ruby会将`string.chr`值转换为`?`?,ruby,Ruby,我想将字符串中字符的chr值偏移一定量。此代码: def encrypt2(word, num) cipher = word.split('').map{|e| e = e.ord + num e = e.chr }.join.reverse puts cipher end encrypt2('hellozz', 10) 输出:??yvvor。似乎在126.chr之后,它只返回问号。e=e.ord+num将生成非ASCII字符 您可以使用String#next方法

我想将字符串中字符的chr值偏移一定量。此代码:

def encrypt2(word, num)
  cipher = word.split('').map{|e|
    e = e.ord + num
    e = e.chr
  }.join.reverse
  puts cipher
end

encrypt2('hellozz', 10)

输出:
??yvvor
。似乎在
126.chr
之后,它只返回问号。

e=e.ord+num
将生成非ASCII字符

您可以使用
String#next
方法获取给定字符的下一个ASCII字符。但是,
'z'。由于所创建的进位,下一个
将是
'aa'
,因此,在这种情况下,必须选择该结果的第一个字符

所以,你可以写:

num.times { e = e.next[0]}


e=e.ord+num
将生成非ASCII字符

您可以使用
String#next
方法获取给定字符的下一个ASCII字符。但是,
'z'。由于所创建的进位,下一个
将是
'aa'
,因此,在这种情况下,必须选择该结果的第一个字符

所以,你可以写:

num.times { e = e.next[0]}


因为您的控制台没有显示非ASCII(<128)字符?如果关键是要有一个基于ASCII的转置密码,你不能盲目添加,那么你需要旋转/模/等等。@DaveNewton问题恰恰相反。生成的符号不是格式良好的UTF-8符号,因为以
(128..256)
开头的符号应该有两个字节。因为您的控制台没有显示非ASCII(<128)字符?如果关键是要有一个基于ASCII的转置密码,你不能盲目添加,那么你需要旋转/模/等等。@DaveNewton问题恰恰相反。生成的符号不是格式良好的UTF-8符号,因为那些以
(128..256)
开头的符号应该有两个字节。分配
cipher
var是多余的。@mudasobwa很好的一点-我刚刚复制了OP的代码,将修复它。这真的没有理由是一行。易读的代码总是比简洁的代码好。分配
cipher
var是多余的。@mudasobwa很好的一点-我刚刚复制了OP的代码,将修复它。这真的没有理由是一行。易读的代码总是比简洁的代码好。