字符串编码ruby和javascript之间的长度不匹配

时间:2014-01-24 16:19:50

标签: javascript ruby-on-rails ruby encoding character-encoding

我使用Ruby on Rails,但这并不重要(除了Rails如何编码请求参数)。

我有一个文本框,用户可以在其中输入文字。我使用XHR将此文本发送回我的ruby后端,后端执行一系列字符串处理。它查找某些关键字,然后将它找到的关键字列表及其起始索引返回给客户端。

然后我在javascript中处理关键字和索引以做更多的事情。

问题是如果文本包含非ASCII字符,则Ruby的索引与javascript的索引不匹配。 Javascript像处理任何其他字符一样处理不兼容的unicode字符,而Ruby将其转换为各种代码序列,这些代码序列会改变字符串的长度,并使索引无效。

关于如何处理这种情况的任何建议?简单的转义/ unescape编码/解码将无法正常工作。

这是一个例子 Mary had ä little lamb

我的数据库中有little lamb的关键字匹配。

Ruby(在Rails参数化之后)返回该字符串为23的长度,以及little lamb的起始索引为12。

Javascript返回字符串长度22,起始索引为11。

2 个答案:

答案 0 :(得分:1)

计算可见字符而不是字节是对1.9版本中的Ruby所做的更改。要在Ruby中获得相同的字节数,可能需要升级到1.9.3或更高版本(如果还没有):

RUBY_VERSION
#=> "1.9.3"

str = 'Mary had ä little lamb'
keyword = 'little lamb'

str.size
#=> 22

str.index(keyword)
#=> 11

答案 1 :(得分:1)

我没有尝试过这个,因为我没有使用过Ruby 1.8.7,但也许mb_chars可以帮助你。

http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html

尝试运行"Mary had ä little lamb".mb_chars.size

无论哪种方式,都应该升级到Ruby 2.1,因为不再支持Ruby 1.8.7。