ruby 1.8和1.9之间的字符串长度差异

时间:2012-10-12 21:02:48

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我有一个运行在ruby 1.8.7上的网站。我对传入的帖子进行了验证,检查以确保我们允许最多12000个字符。这些空格被计为字符,并且在帖子进行验证之前,会删除制表符和回车符。

以下是需要验证的帖子http://pastie.org/5047582

在ruby 1.9中,字符串长度显示为11909,这是正确的。但是当我检查红宝石1.8.7的长度时,结果是12044。

我使用codepad.org运行这个ruby代码,它给了我http://codepad.org/OxgSuKGZ(输出长度为12044,这是错误的)但是当我在codeacademy.org的控制台中运行相同的代码时,字符串长度是11909

有人能解释我为什么会这样吗???

由于

1 个答案:

答案 0 :(得分:11)

这是一个Unicode问题。您使用的字符串包含ASCII范围之外的字符,经常使用的UTF-8编码将这些字符编码为2(或更多)字节。

Ruby 1.8没有正确处理Unicode,而length只是在字符串中给出 bytes 的数量,这会带来有趣的东西,如:

"ą".length
=> 2

Ruby 1.9具有更好的Unicode处理能力。这包括length返回字符串中实际的字符数,只要Ruby知道编码:

"ä".length
=> 1

Ruby 1.8中的一种可能的解决方法是使用正则表达式,这可以使Unicode识别:

"ą".scan(/./mu).size
=> 1