我使用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。
答案 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。