环境 : ruby 1.8.7 + rails 2.1.0 + ubuntu 8.10
ruby 在截取 中文字符串时 经常出现乱码 。例如:
a = "测a试 中文aaa"
b = 'test'
p a.size # 17 (可以看出一个中文字符在ruby中是3个英文字符)
p b.length # 4
puts a.slice(0,13) # 测a试 中� slice method (0是start下标处,13是length)
最后一个输出最后 是乱码,在java中是unicode编码就没有这个问题,所以我们需要转换下编码来解决。。
例如在rails的 application_helper.rb 定义一个转换的方法
def cut_string(charset,src,start,length)
require "iconv"
@conv=Iconv.new("UTF-16",charset)
@reverse_conv=Iconv.new(charset,"UTF-16")
p_start=start.class==Fixnum&&start>=0
p_length=length.class==Fixnum&&length>=0
return "" unless src&&p_start&&p_length
src_utf16=@conv.iconv(src)
cutted_src_utf_16=src_utf16[2*start+2,2*length]
@reverse_conv.iconv(cutted_src_utf_16)
end
view中使用:
<%
a = '测a 试中文'
puts cut_string('UTF-8',a,0,4) # 测a 试
%>
ref:
http://my.opera.com/sawpad/blog/show.dml/235183
http://www.javaeye.com/topic/201531
补充:
真伤心,之前截取字符串,用上面的方法,还需要自己封装,自己转码解决,没想到rails已经把我们封装好了。。就是 truncate 方法。。看了下源码真简单,只需要输出对应字符串的chars 就解决了,源码:
def truncate(text, length = 30, truncate_string = "...")
if text
l = length - truncate_string.chars.length
chars = text.chars
(chars.length > length ? chars[0...l] + truncate_string : text).to_s
end
end
使用demo:
<%
a = 'test'
b = '测试中文'
p truncate(a,2,'...') # "tes..."
p truncate(b,2,'...') # "测试中..."
%>
如果需要得到汉字的长度 可以使用 jcode 库 里的 jlength
demo:
s = "测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试
140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试140字测试1"
$KCODE='utf8'
require 'jcode'
p s.jsize
p s.jlength
ref:
http://blog.guoshuang.com/?p=4769
http://lifegoo.pluskid.org/?p=257
posted on 2009-08-24 14:23
fl1429 阅读(3657)
评论(0) 编辑 收藏 所属分类:
Rails