2010-08-30 9 views
4

Dans mon application Rails (2.3, Ruby 1.8.7), j'ai besoin de tronquer une chaîne à une certaine longueur. la chaîne est unicode, et lors de l'exécution de tests dans la console, tels que 'א'.length, j'ai réalisé qu'une double longueur est renvoyée. Je voudrais une longueur agnostique de codage, de sorte que la même troncature soit faite pour une chaîne unicode ou une chaîne codée latin1.Longueur d'une chaîne unicode

J'ai parcouru la plupart du matériel Unicode pour Ruby, mais je suis encore un peu dans le noir. Comment ce problème devrait-il être traité?

Répondre

4

Rails a une méthode mb_chars qui renvoie des caractères multi-octets. Essayez unicode_string.mb_chars.slice(0,50)

+0

Voici ce que j'ai finalement utilisé: http://pastie.org/1129327 – shmichael

0

Vous pouvez utiliser quelque chose comme str.chars.slice(0, 50).join pour obtenir les 50 premiers caractères d'une chaîne, quel que soit le nombre d'octets utilisés par caractère.

+0

Dans la console, je reçois 'méthode non définie tranche » pour # ' – shmichael

3
"ア".size # 3 in 1.8, 1 in 1.9 
puts "ア".scan(/./mu).size # 1 in both 1.8 and 1.9 
1

chars et mb_chars éléments texte que vous ne donnez pas, ce qui est ce que vous semblez être à la recherche.

Pour les éléments de texte, vous devez utiliser le unicode gem.

mb_chars:

>> 'กุ'.mb_chars.size 
=> 2 

>> 'กุ'.mb_chars.first.to_s 
=> "ก" 

text_elements:

>> Unicode.text_elements('กุ').size 
=> 1 

>> Unicode.text_elements('กุ').first 
=> "กุ"