锁定老帖子 主题:Ruby每周一测 - 中英文混合字符串截取
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-09
Ruby Quiz上的文章,而是我自己出的一个quiz :
这篇Ruby每周一测有点特殊,它不是翻译我们在做页面排版的时候,为了避免过长字符串撑开页面,经常需要调用截取过长字符串的方法,rails已经为我们提供了一个方法: ActionView::Helpers::TextHelper#truncate(text, length = 30, truncate_string = "...") 调用很简单: truncate("Once upon a time in a world far far away", 14) # => Once upon a... truncate("Once upon a time in a world far far away") # => Once upon a time in a world f... truncate("And they found that many people were sleeping better.", 25, "(clipped)") # => And they found that many (clipped) 但是遇到中文字符串的时候它就不那么完美了:它把一个中文作为和英文相同的长度来截取,使用同样的length参数,会导致截取的英文字符串比中文字符串在视觉上短很多 为了解决这个问题,JavaEye使用的方法是把一个中文大约视为2个英文的宽度,实现truncate_u方法: truncate_u(text, length = 30, truncate_string = "...") 执行结果和rails的truncate略有不同,length是指中文字宽,truncate_string不计算在length里 truncate_u("english string", 2) # 截取2个中文字宽,所以是返回4个英文加上"..." # => engl... truncate_u("中文字符串", 2) # => 中文... truncate_u("中文 and english", 6) # 截取6个中文字宽,所以是返回2个中文,8个ascii字符,以及truncate_string # => 中文 and eng ... truncate_u("中文 and english", 8) # 完整截取,返回和输入一致的字符串 # => 中文 and english 这次的每周一测就是实现这个方法,或者你有另外更好的中英文混合字符串截取想法,也可以一起来讨论 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-06-09
require 'stringio' $KCODE = "u" def truncate_utf8(text, length = 30, truncate_string = "...") ios=StringIO.new(text) ios.truncate(length*2) ios.string << truncate_string end p truncate_utf8("english string", 2) p truncate_utf8("中文字符串", 2) p truncate_utf8("中文 and english", 6) p truncate_utf8("中文 and english",8) |
|
返回顶楼 | |
发表时间:2008-06-09
hi simohayha,
utf8编码的字符应该是3字节吧, 你用的是length*2,我在测试你的解法第一个中文会输出乱码,而且最后2个输出结果也不对。 ruby 1.8.6, rails 2.0.2, ubuntu 7.10 |
|
返回顶楼 | |
发表时间:2008-06-09
ActiveSupport::CoreExtensions::String::Unicode里面有个chars方法,总返回utf-8的结果,请自行参考,程序我就不写了吧?
|
|
返回顶楼 | |
发表时间:2008-06-09
刑天战士 写道 ActiveSupport::CoreExtensions::String::Unicode里面有个chars方法,总返回utf-8的结果,请自行参考,程序我就不写了吧?
我在文中提到Rails自带的ActionView::Helpers::TextHelper#truncate方法就是用chars来实现的,就是为了解决它带来的视觉长度问题,才出这个ruby quiz的 为了避免误解,我把文章中的方法名重新编辑一下吧 |
|
返回顶楼 | |
发表时间:2008-06-09
丢人了,大家当作没看见吧。或者当作回帖不看贴的典型来处理……。
|
|
返回顶楼 | |
发表时间:2008-06-09
Quake Wang 写道 hi simohayha,
utf8编码的字符应该是3字节吧, 你用的是length*2,我在测试你的解法第一个中文会输出乱码,而且最后2个输出结果也不对。 ruby 1.8.6, rails 2.0.2, ubuntu 7.10 linux我没试,在xp下,我试了下,完全可以的。。 |
|
返回顶楼 | |
发表时间:2008-06-09
我没有xp环境,不过在win2000下面测试了一下,也是同样的问题:
第一个输出乱码 第二个输出: "中文 and e..." 第三个输出: "中文 and engli..." 和题目的要求不符 我是直接用irb或rails console,然后复制代码直接在console里面跑测试的,你是怎么测试的? |
|
返回顶楼 | |
发表时间:2008-06-10
我是没有开console,我是直接运行...
|
|
返回顶楼 | |
发表时间:2008-06-10
simohayha 写道 我是没有开console,我是直接运行...
可能是你在保存ruby文件的时候没有使用utf8编码,在windows环境下面默认使用了GBK |
|
返回顶楼 | |