发到新浪微博用的
做了下实验,结果有点怪。
1.9.2p320 :001 > a = "\u6c34\u6d52\u4f20"
=> "水浒传"
1.9.2p320 :002 > a.truncate(1)
=> "水..."
1.9.2p320 :003 > a = "\u6c34some??\u6d52\u4f20"
=> "水some??浒传"
1.9.2p320 :004 > a.truncate(3)
=> "..."
1.9.2p320 :005 > a.truncate(4)
=> "水..."
1.9.2p320 :006 > a.truncate(5)
=> "水s..."
1.9.2p320 :007 >
# encoding: utf-8
str = "水浒传abcdef水浒传"
puts str.scan(/./)[0, 3] # =>水浒传
puts str.scan(/./)[0, 4] # =>水浒传a
puts str.scan(/./)[0, 10] # =>水浒传abcdef水
不过我感到奇怪的是,在我写的一个发推的 web 程序里面
def twitter
twitter = params[:twitter].to_s #从form里面的到输入的文字
twitter = twitter[0, 137] + '...' if twitter.size > 140
Twitter.update(twitter, :in_reply_to_status_id=>params[:since_id])
redirect_to :action => 'timeline'
end
这样是能直接截断发 140 个文字来着,也是中英文数字标点符号混合
#coding=utf-8
#n为要截取的长度
n = 4
puts "水浒传sudhgsdug".encode("gbk").force_encoding("binary")[0...n * 2].force_encoding("gbk").encode("utf-8")
#11 楼 @dotnil 又是这种奇葩的设定……是我就无视了,浪费就浪费了
PS: 裁字问题的一个汇总文章 http://rubylution.herokuapp.com/topics/10
我觉得楼主可以查看一下twitter-text-rb
这个项目https://github.com/twitter/twitter-text-rb
之前用到过一下,里面 twitter 计算混合字符长度是用ActiveSupport::Multibyte::Chars
来做的,
项目之余简单做了一下实验,不知道如下是不是可以帮助到楼主 (ActiveSupport::Multibyte::Chars
这个类的 truncate 自动添加了...
):
jruby-1.6.7 :019 > text1 = "\u6c34some??\u6d52\u4f20"
=> "水some??浒传"
jruby-1.6.7 :020 > text2 = ActiveSupport::Multibyte::Chars.new(text1).normalize(:c)
=> #<ActiveSupport::Multibyte::Chars:0x458176ff @wrapped_string="水some??浒传">
jruby-1.6.7 :021 > text2.length
=> 9
jruby-1.6.7 :022 > text2.truncate(5)
=> #<ActiveSupport::Multibyte::Chars:0x4717e412 @wrapped_string="水s...">
可以看到中英混在一起可以正确的计算出长度,然后按照你给出的长度进行截取后会自动补全...
,还是挺方便的吧