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

时间:2011-10-17 11:37:17

标签: ruby unicode utf-8 formatting

str = "é-du-Marché"

我通过

获得第一个字符
str.split(//).first

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

2 个答案:

答案 0 :(得分:2)

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"]

用ruby 1.8.6测试:

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

使用firstlast,您可以获得结果:

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

答案 1 :(得分:1)

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

这应该正常。尝试查看解释如何处理旧版ruby版本中的多字节数据的http://blog.grayproductions.net/articles/bytes_and_characters_in_ruby_18

<强> EDIT3

玩弄扫描&amp;加入操作让我更接近你的问题&amp;解。老实说,我没有时间让完整的解决方案正常工作,但如果您使用扫描(/./​​ mu)选项,则将其转换为utf-8,这是所有ruby版本都支持的。

相关问题