论坛首页 编程语言技术论坛

Ruby每周一测 - 中英文混合字符串截取

浏览 18946 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-09  
这篇Ruby每周一测有点特殊,它不是翻译Ruby Quiz上的文章,而是我自己出的一个quiz 

我们在做页面排版的时候,为了避免过长字符串撑开页面,经常需要调用截取过长字符串的方法,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


这次的每周一测就是实现这个方法,或者你有另外更好的中英文混合字符串截取想法,也可以一起来讨论
   发表时间: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)
0 请登录后投票
   发表时间:2008-06-09  
hi simohayha,
utf8编码的字符应该是3字节吧, 你用的是length*2,我在测试你的解法第一个中文会输出乱码,而且最后2个输出结果也不对。
ruby 1.8.6, rails 2.0.2, ubuntu 7.10
0 请登录后投票
   发表时间:2008-06-09  
ActiveSupport::CoreExtensions::String::Unicode里面有个chars方法,总返回utf-8的结果,请自行参考,程序我就不写了吧?
0 请登录后投票
   发表时间:2008-06-09  
刑天战士 写道
ActiveSupport::CoreExtensions::String::Unicode里面有个chars方法,总返回utf-8的结果,请自行参考,程序我就不写了吧?

我在文中提到Rails自带的ActionView::Helpers::TextHelper#truncate方法就是用chars来实现的,就是为了解决它带来的视觉长度问题,才出这个ruby quiz的 
为了避免误解,我把文章中的方法名重新编辑一下吧
0 请登录后投票
   发表时间:2008-06-09  
丢人了,大家当作没看见吧。或者当作回帖不看贴的典型来处理……
0 请登录后投票
   发表时间: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下,我试了下,完全可以的。。
0 请登录后投票
   发表时间:2008-06-09  
我没有xp环境,不过在win2000下面测试了一下,也是同样的问题:
第一个输出乱码
第二个输出:
"中文 and e..."
第三个输出:
"中文 and engli..."
和题目的要求不符

我是直接用irb或rails console,然后复制代码直接在console里面跑测试的,你是怎么测试的?
0 请登录后投票
   发表时间:2008-06-10  
我是没有开console,我是直接运行...
0 请登录后投票
   发表时间:2008-06-10  
simohayha 写道
我是没有开console,我是直接运行...

可能是你在保存ruby文件的时候没有使用utf8编码,在windows环境下面默认使用了GBK
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics