Tuesday, June 10, 2008

如何用ruby验证字符串中是否包括中文字


def include_chinese_char?(str)
# /[\u4e00-\u9fa5]/ unicode 中文字符集范围 即: 一-龥
/[一-龥]/ =~ str
end

puts include_chinese_char?("ruby regexp.")
puts include_chinese_char?("中 ruby regexp.")
puts include_chinese_char?("ruby 中 regexp.")
# >> nil
# >> 0
# >> 5

字符串与unicode编码的相互转换

unicode编码简而言之就是将每一个字符用16位2进制数标识。但是通常都用4位的16进制数标识。
例如:
1)中文字符串"你好"的unicode码为:\u4f60\u597d;
2)英文字符串"ab"的unicode码为:\u0061\u0062;
其中\u是标识unicode码用的,后面的4位16进制数则是对应字符的unicode码。

1、unicode编码规则
unicode码对每一个字符用4位16进制数表示。具体规则是:将一个字符(char)的高8位与低8位分别取出,转化为16进制数,
如果转化的16进制数的长度不足2位,则在其后补0,然后将高、低8位转成的16进制字符串拼接起来并在前面补上"\u" 即可。

2、用java代码说明unicode的编码规则 [java的unicode解码编码的代码详见javaeye的帖子]

public class Unicode {

public static void main(String[] args) {
char c = '一'; // 一(4e00)是unicode中文字符集首字,龥(9fa5)是unicode中文字符集尾字
int i, j;
i = c & 0xFF;
j = c >>> 8;
System.out.println("Original character is: " + c);
System.out.println("low 8 bit is: " + i);
System.out.println("high 8 bit is: " + j);
}

}
$> javac Unicode.java
$> java Unicode
Original character is: 一
low 8 bit is: 0
high 8 bit is: 78
78转为16进制为4e,将高、低8位转成的16进制字符串拼接起来即为\u4e00,这就是中文字"一"的unicode编码。
在ajax请求返回的responseText或者json数据可以先在服务器端编码为unicode格式传给客户端浏览器,这样客户端的页面无论是什么编码,js都可以很好的处理返回的内容。
4e00的十进制值为4 * 16 * 16 * 16 + 14 * 16 * 16 + 0 * 16 + 0 = 19968
网页中则可以用一来表示中文字"一",这样不论网页以何种编码,页面始终都可以正常显示,而不会出现乱码。这种方法以前在做wap项目常常将页面上所有中文字都用unicode编码后发布,就是为了避免乱码问题。

3、javascript代码,验证字符串中是否包括中文字
/[\u4e00-\u9fa5]/.test(str)

4、ruby中验证字符串中是否包括中文字
/[一-龥]/ =~ str

Reference:
http://haoi77.javaeye.com/blog/198840

Number toString 方法使用

Number.toString(radix)
Converts a number to a string, using a specified radix (base), and returns the string. radix must be between 2 and 36. If omitted, base 10 is used.
比如中文“一”字的unicode编码为\u4e00,要想得到对应的unicode十进制编码,在js中不必用4 * 16 * 16 * 16 + 14 * 16 + 0 + 0 = 19968来获得,可以直接用Number.toString()方法得到:
(0x4e00).toString(10) = "19968"
这样得到的值可以再用js加上前后缀成为"&#" + "19968" + ";" = "一"后可以直接从网页中输出。
反过来,如果知道十进制的一个数字,也可以很容易转换成16进制的值:
(19968).toString(16) = "4e00"