2010-08-30 134 views
4

在我的Rails(2.3,Ruby 1.8.7)应用程序中,我需要将字符串截断为一定长度。该字符串是unicode,并且在控制台中运行测试时(例如'א'.length),我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码的字符串进行相同的截断。unicode字符串的长度

我已经超过大多数Ruby的unicode的材料,但我还是有点黑暗。应该如何解决这个问题?

回答

4

Rails有一个mb_chars方法,它返回多字节字符。尝试unicode_string.mb_chars.slice(0,50)

+0

这是我最终使用: http://pastie.org/1129327 – shmichael 2010-08-31 16:39:03

0

您可以使用类似str.chars.slice(0, 50).join得到一个字符串的前50个字符不管它每字符多少字节使用。

+0

在控制台中,我得到'未定义的方法'片”为#<可枚举::枚举:0xb67a0ed4>' – shmichael 2010-08-31 06:12:00

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

charsmb_chars不给你文字元素,这是你仿佛在寻找。

对于文本元素,你会希望unicode gem

mb_chars:

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

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

text_elements:

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

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