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

Rag*_*ghu 6 ruby ruby-on-rails 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.

谁能解释我为什么会这样?

谢谢

Jak*_*ski 11

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

Ruby 1.8没有正确处理Unicode,length只是给出了字符串中的字节数,这导致了有趣的东西,如:

"?".length
=> 2
Run Code Online (Sandbox Code Playgroud)

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

"ä".length
=> 1
Run Code Online (Sandbox Code Playgroud)

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

"?".scan(/./mu).size
=> 1
Run Code Online (Sandbox Code Playgroud)