2014-01-24 66 views
0

我在Ruby on Rails上,但這並不重要(除了Rails如何編碼請求參數)。字符串編碼ruby和javascript之間的長度不匹配

我有一個文本框,用戶可以輸入文本。我使用XHR將這些文本發回給我的ruby後端,它執行一系列字符串處理。它查找某些關鍵字,然後向客戶端返回它找到的關鍵字列表以及它們在字符串中的起始索引。

然後我在JavaScript中處理關鍵字和索引來做更多事情。

問題是,如果文本包含非ASCII字符,則Ruby的索引與JavaScript的索引不匹配。 Javascript像任何其他字符一樣處理不符合要求的unicode字符,而Ruby則將其轉換爲各種代碼序列,這些代碼序列會改變字符串的長度,並使索引無用。

有關如何處理這種情況的任何建議?簡單的轉義/ unescape編碼/解碼將不起作用。

下面是一個例子 Mary had ä little lamb

我有一個關鍵字匹配在我的數據庫爲little lamb

紅寶石(後Rails的參數化)返回的23串的長度,以及作爲little lamb 12.

的Javascript返回22的字符串長度的起始索引,和11.

回答

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不再支持。

+0

mb_chars工作得很好!對於未在Rails中的未來人員,您還可以嘗試[jcode模塊](http://ruby-doc.org/stdlib-1.8.7/libdoc/jcode/rdoc/String.html) – mastaBlasta

1
開始索引

計算可見字符而不是字節是對Ruby 1.9版本的更改。要獲得相同數量的紅寶石字節,也許你需要升級到1.9.3或更高,如果您尚未:

RUBY_VERSION 
#=> "1.9.3" 

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

str.size 
#=> 22 

str.index(keyword) 
#=> 11 
+0

我在Ruby 1.8.7上,所以我想這是一個問題。我可以使用任何替代方案? – mastaBlasta

+0

對不起,我不知道。 –