我们首先想到的是使用String.length获取字符串的长度,但是这个函数在纯ascii字符串的时候能够准确获取字符个数。在中文或者中英文混合的时候就不行了。看下面这个例子。
拷贝一段代码,保存为文件kcode.rb。
chars = text.split(//)
puts "the length of the Array: ",chars.length
字符串“text”是一个中英文混合的字符串,text.length将会返回3。因为将中文“呀”当作两个字符来计算了。
使用命令 ruby kcode.rb将会输出:
the length of the Array:
3
the length of the String:
3
在这里我们可以看到,ruby把中文当作两个字符了。
但是如果想要ruby将中文也当作一个字符的话,如何处理?试着使用 ruby -KU kcode.rb运行这个文件,将会输出:
the length of the Array:
2
the length of the String:
3
输出的2应该就是我们想要的结果。这里惟一的不同是“-KU”这个参数。
-K是ruby.exe的一个参数,作用是:
' Specifies the code set to be used. This option is useful mainly when Ruby is used for Japanese-language processing. kcode may be one of: e, E for EUC; s, S for SJIS; u, U for UTF-8; or a, A, n, N for ASCII. (笔者:ruby是日本人发明的,所以人家的说明中说这主要是为日语处理而设置的参数。)
在这里-KU是设置为UTF-8。而设置了这个参数后,使用text.split(//)就会按照指定的编码将text的字符转化为Array数组。中文“呀”就被当作一个单一字符。所以数组chars.length是2。但是text.length却仍然是3。这个对比就是告诉我们,在使用了-KU后,当需要把获得中英文混合的字符串的字符个数的时候,可以使用split(//)将字符串分割为单个字符组成的数组,再获取数组的长度就是了。而不是使用String.length获取字符个数。
获取字符个数的典型应用是截取字符串。例如当要从一个中文/中英文混合字符串中截取一定长度的字符的时候,如果不使用-KU参数,很容易出现乱码的情况。笔者在作ruby on rails应用的时候发现这个问题的。如果在rails的应用中要使用-KU参数的话,只需要象这样启动WEBrick服务器就可以了: ruby -KU script/server。
作者:Thomas Yung 200506 联系作者:earoc@126.com
转载请保留作者声明。