Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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中反转_Ruby_Ruby On Rails 3 - Fatal编程技术网

上的奇怪行为。在Ruby中反转

上的奇怪行为。在Ruby中反转,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,当我尝试在包含撇号的Ruby字符串上调用.reverse时,它会将它们更改为\231\200?。因此,对于包含s'tI的顺序错误的字符串,调用reverse会导致It\231\200?s,而不是It。有什么想法吗 我猜这与多字节安全有关?有解决办法吗?这在ruby 1.9中运行良好,ruby 1.9正确处理unicode: >> "s’tI".reverse => "It’s" 在ruby 1.8中被破坏了,因为它对unicode字符串没有相同的支持,而且那些撇号是非1字节a

当我尝试在包含撇号的Ruby字符串上调用.reverse时,它会将它们更改为
\231\200?
。因此,对于包含
s'tI
的顺序错误的字符串,调用reverse会导致
It\231\200?s
,而不是
It
。有什么想法吗


我猜这与多字节安全有关?有解决办法吗?

这在ruby 1.9中运行良好,ruby 1.9正确处理unicode:

>> "s’tI".reverse
=> "It’s"

在ruby 1.8中被破坏了,因为它对unicode字符串没有相同的支持,而且那些撇号是非1字节ascii字符,它们是多字节unicode字符(例如,当编码为UTF-8时)。

这在ruby 1.9中工作得很好,它正确地处理unicode:

>> "s’tI".reverse
=> "It’s"

在ruby 1.8中被破坏了,因为它对unicode字符串没有相同的支持,而且那些撇号是非1字节ascii字符,它们是多字节unicode字符(例如,当编码为UTF-8时)。

问题是字符串使用二进制字符而不是unicode字符。您必须先将二进制字符串解码为Unicode字符串

irb(main):001:0> "a\u9F9Cb".reverse
=> "b\u9F9Ca"
irb(main):002:0> "a\xE9\xBE\x9Cb".reverse
=> "a\x9C\xBE\xE9b"
irb(main):003:0> "a\xE9\xBE\x9Cb".force_encoding('UTF-8').reverse
=> "b\u9F9Ca"

问题是字符串使用的是二进制字符,而不是Unicode字符。您必须先将二进制字符串解码为Unicode字符串

irb(main):001:0> "a\u9F9Cb".reverse
=> "b\u9F9Ca"
irb(main):002:0> "a\xE9\xBE\x9Cb".reverse
=> "a\x9C\xBE\xE9b"
irb(main):003:0> "a\xE9\xBE\x9Cb".force_encoding('UTF-8').reverse
=> "b\u9F9Ca"

正如其他人所解释的,您正在处理utf-8,因此一些字符由多个字节表示。还有一些事情,比如组合字符、代理项对等。ruby 1.8的逐字节反转忽略了所有这些,所以会把事情搞砸

Ruby 1.9确实了解字符串编码,但是如果你一直停留在Ruby 1.8上,rails有自己的处理utf8的系统-你可以调用字符串上的
mb_字符
,然后返回一些看起来像字符串的东西,行为像字符串,但实现了类似于
reverse
downcase
的unicode方法。比如你能做什么

reversed_string = string.mb_chars.reverse

正如其他人所解释的,您正在处理utf-8,因此一些字符由多个字节表示。还有一些事情,比如组合字符、代理项对等。ruby 1.8的逐字节反转忽略了所有这些,所以会把事情搞砸

Ruby 1.9确实了解字符串编码,但是如果你一直停留在Ruby 1.8上,rails有自己的处理utf8的系统-你可以调用字符串上的
mb_字符
,然后返回一些看起来像字符串的东西,行为像字符串,但实现了类似于
reverse
downcase
的unicode方法。比如你能做什么

reversed_string = string.mb_chars.reverse

这在ruby 1.8中不起作用,我认为这是更可能的问题,因为ruby 1.9默认为UTF-8。@d11wtq:也许你是对的,我没有真正用ruby编程(我不是ruby程序员),但有可能来自外部源的数据仍然是二进制编码的……这在ruby 1.8中不起作用,我认为这是更可能的问题,因为ruby 1.9默认为UTF-8。@d11wtq:也许你是对的,我还没有真正用ruby编程(我不是ruby程序员),但有可能来自外部源的数据仍然是二进制编码的……有没有办法在1.8.7中处理这个问题?@d11wtq看起来很有效,但只使用unicode,这可能是最常见的用例。不管怎样,我还是推荐1.9。在1.8.7中有什么方法可以解决这个问题吗?@d11wtq看起来是可行的,但只适用于unicode,这可能是最常见的用例。我还是推荐1.9。