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

这篇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


这次的每周一测就是实现这个方法,或者你有另外更好的中英文混合字符串截取想法,也可以一起来讨论

你可能感兴趣的:(ios,XP,ubuntu,Ruby,Rails)