这篇Ruby每周一测有点特殊,它不是翻译[url=http://rubyquiz.com/]Ruby Quiz[/url]上的文章,而是我自己出的一个quiz :) :
我们在做页面排版的时候,为了避免过长字符串撑开页面,经常需要调用截取过长字符串的方法,rails已经为我们提供了一个方法:
调用很简单:
但是遇到中文字符串的时候它就不那么完美了:它把一个中文作为和英文相同的长度来截取,使用同样的length参数,会导致截取的英文字符串比中文字符串在[color=red][b]视觉上短很多[/b][/color]
为了解决这个问题,JavaEye使用的方法是把一个中文大约视为2个英文的宽度,实现truncate_u方法:
执行结果和rails的truncate略有不同,length是指中文字宽,truncate_string不计算在length里
这次的每周一测就是实现这个方法,或者你有另外更好的中英文混合字符串截取想法,也可以一起来讨论
我们在做页面排版的时候,为了避免过长字符串撑开页面,经常需要调用截取过长字符串的方法,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参数,会导致截取的英文字符串比中文字符串在[color=red][b]视觉上短很多[/b][/color]
为了解决这个问题,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
这次的每周一测就是实现这个方法,或者你有另外更好的中英文混合字符串截取想法,也可以一起来讨论