6

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

这是经过验证的帖子http://pastie.org/5047582

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

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

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

谢谢

4

1 回答 1

11

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

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

"ą".length
=> 2

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

"ä".length
=> 1

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

"ą".scan(/./mu).size
=> 1
于 2012-10-12T21:19:10.347 回答