繁体   English   中英

无论ruby版本如何,拆分utf8字符串

[英]Split utf8 string regardless of ruby version

str = "é-du-Marché"

我得到了第一个char via

str.split(//).first

无论我的ruby版本如何,我如何获得其余的字符串?

String首先没有方法。 所以你需要另外一个分裂。 当您以unicode模式(完全是utf-8)进行拆分时,您可以访问第一个(和其他字符)。

我的解决方案

puts RUBY_VERSION
str = "é-du-Marché"
p str.split(//u, 2)

用ruby 1.9.2测试:

1.9.2
["\u00E9", "-du-March\u00E9"]

用红宝石1.8.6测试:

1.8.6
["\303\251", "-du-March\303\251"]

有了first也是last你得到的结果

  • str.split(//u, 2).first是第一个字符
  • str.split(//u, 2).last是第一个字符str.split(//u, 2).last的字符串。

通常, str[1..-1]应该返回第一个数字之后的所有内容。

第一个数字是起始索引 ,将其设置为1以跳过第一个数字, 第二个是长度 ,其设置为-1,因此红宝石从背面开始计数

注意 :多字节字符仅适用于Ruby 1.9。 如果您想向下模仿这种行为,则必须自己遍历字节并找出需要从数据中删除的内容,因为Ruby 1.8不支持此行为。

更新:

您也可以尝试这一点,但我无法保证它适用于每个多字节字符:

str = "é-du-Marché"
substring = str.mb_chars[1..-1]

mb_chars是一个代理类,在处理字符的UTF-8,UTF-32或UTF-16编码(例如,多字节字符)时,将调用定向到适当的实现。 可以在这里找到更多详细信息: http : //api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html但我不知道在较旧的Rails版本中是否存在

UPDATE2:

Ruby 1.8将任何字符串视为一堆字节,在其上调用size()将返回用于存储数据的字节数。 要确定不考虑编码的字符,请尝试以下操作:

char_array = str.scan(/./m)
substring = char_array[1..-1].join

这通常可以解决问题。 尝试查看http://blog.grayproductions.net/articles/bytes_and_characters_in_ruby_18 ,其中介绍了如何在较旧的ruby版本中处理多字节数据。

编辑3

进行扫描和联接操作使我更接近您的问题和解决方案。 老实说,我没有时间来使用完整的解决方案,但是如果您使用scan(/./ mu)选项,则会将其转换为utf-8,所有红宝石版本都支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM