如何在Ruby中处理Unicode字符串?

时间:2014-07-29 12:41:11

标签: ruby unicode irb

在Ruby教程中看到了以下构造:

irb(main):001:0> "abc".each_byte { |c| printf "<%c>", c }
<a><b><c>=> "abc"

但是,如果我将字符串Здравствуйте!代替abc,我会得到

irb(main):003:0> "Здравствуйте!".each_byte { |c| printf "<%c>", c }
<Ð><><Ð><´><Ñ><><Ð><°><Ð><²><Ñ><><Ñ><><Ð><²><Ñ><><Ð><¹><Ñ><><Ð><µ><!>=> "Здравствуйте!"

如何处理Unicode字符串?

irb(main):005:0> RUBY_VERSION
=> "1.9.3"

2 个答案:

答案 0 :(得分:4)

▶ "Здравствуйте!".each_char { |c| printf "<%c>", c }
# ⇒ <З><д><р><а><в><с><т><в><у><й><т><е><!>=> "Здравствуйте!"

字节是字节,而char是char,由字节组成。

答案 1 :(得分:1)

一个字节是8位。但是,当存储在您的计算机上时,unicode字符可能会占用多个字节。例如,假设一些unicode字符的整数代码是8,000,这实际上是存储在您的计算机上的。当ruby读入8,000时,ruby知道代表一些unicode字符。但是,8,000不能存储在您的计算机上的一个字节中(可以存储在一个字节中的最大数字是1111 1111,即255)。如果你告诉ruby你的计算机上存储的8,000字节的每个字节代表一个字符,即通过调用each_byte(),那么ruby将永远不会看到8,000。相反,ruby会读取8,000个片段并认为代表一个字符,然后读取另一个8,000个片段并认为代表另一个角色。

each_byte()告诉ruby忽略字节簇,并且一次只读取一个字节,然后确定该字节中存储的整数表示什么字符。