首先,什么是Unicode,百科知识:Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等;Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
balabala一堆,其实可以举个例子简单的理解一下:秦国一统六国后,统一货币,度量衡等,创造一个统一的标准,所有秦的领土范围内都使用这个标准,标准统一后,各种杂七杂八混乱的问题也就随着解决了,然后走向人生巅峰,迎娶xxx云云。 。。
Unicode也一样,它把所有的语言(中文、英文、韩文...)都纳入到一套编码中,统一所有的文字编码,这样就解决了中国用中国定制的编码,日本用日本定制的编码....这种混乱的现象,这样就不会出现乱码的现象了。Unicode中一般用两个字节(16bit)表示一个字符,就算原有的英文编码也从单字节变成了双字节,但是影响不大,把高位字节置0就完事了(如有错请帮我评论指出,谢谢!)
Unicode编码取值: 0 - 65535 (0x0000 - 0xFFFF),
js 中Unicode是以十六进制代码外加开头 \u 表示的字符串,例如: 爱 // js中表示为 \u7231
说一下js中的String对象的两个方法:
//返回字符串某一下标处的Unicode编码;index从0开始 // 如果取负数 或者 >=字符串长度 的值则返回NAN stringObject.charCodeAt(index) : ,如果 例如: "爱".charCodeAt(0) // 输出29233 // numX是unicode编码(十进制类型) //返回一个或多个Unicode编码对应的汉字 String.fromCharCode(numX,numX,...,numX): 例如:String.fromCharCode(29233) //输出‘爱’
好了,既然要把汉字转换成Unicode编码,总得知道汉字的Unicode编码范围吧,不然怎么判断呢
简体汉字: \u4e00-\u9fa5
// 判断字符是否为汉字,
function isChinese(s){
return /[\u4e00-\u9fa5]/.test(s);
}
js中汉字转Unicode编码:
// 把字符串中的汉字转换成Unicode
function ch2Unicdoe(str){
if(!str){
return;
}
var unicode = '';
for (var i = 0; i < str.length; i++) {
var temp = str.charAt(i);
if(isChinese(temp)){
unicode += '\\u' + temp.charCodeAt(0).toString(16);
}
else{
unicode += temp;
}
}
return unicode;
}
var str = 'love中国你好';
console.info(ch2Unicdoe(str)) // love\u4e2d\u56fd\u4f60\u597d
js中Unicode编码 转汉字:
// 方法一
// js中的方法unescape, 对通过escape()方法编码的字符串进行解码,
// 通过找形如: %xx 或者 %xxxx 的字符序列,用Unicode字符\u00xx 和 \uxxxx替换这样的字符序列进行解码
function unescapeF(str){
return unescape(str.replace(/\\/g, "%"))
}
此方法现在ECMAScript v3之后已不能使用,所以不推荐使用
// 方法2, 遍历字符串
function unicode2Ch(str){
if(!str){
return;
}
// 控制循环跃迁
var len = 1;
var result = '';
// 注意,这里循环变量的变化是i=i+len 了
for (var i = 0; i < str.length; i=i+len) {
len = 1;
var temp = str.charAt(i);
if(temp == '\\'){
// 找到形如 \u 的字符序列
if(str.charAt(i+1) == 'u'){
// 提取从i+2开始(包括)的 四个字符
var unicode = str.substr((i+2),4);
// 以16进制为基数解析unicode字符串,得到一个10进制的数字
result += String.fromCharCode(parseInt(unicode,16).toString(10));
// 提取这个unicode经过了5个字符, 去掉这5次循环
len = 6;
}
else{
result += temp;
}
}
else{
result += temp;
}
}
return result;
}
console.info("unicode2Ch:"+ unicode2Ch("love\u4e2d\u56fd1234\u4f60\u597d")) //love中国1234你好
最后,来看一下js中 URI 加密和解密的方法:
decodeURI(URIstring): //可对 encodeURI() 函数编码过的 URI 进行解码
// 对字符串进行URI 编码,该方法不会对 ASCII 字母和数字进行编码
// 也不会对具有特殊含义的 ASCII 标点符号,如: :;/?:@&=+$,# 进行编码
// 也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )
encodeURI(URIstring)
// 例如
var test1="http://www.w3school.com.cn/My first/?中国"
encodeURI(test1) //http://www.w3school.com.cn/My%20first/?%E4%B8%AD%E5%9B%BD
decodeURI(test1) //http://www.w3school.com.cn/My first/?中国
如果要对比如 ? 和 # 的 字符进行URI 编码,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。
decodeURIComponent(URIstring)://对encodeURIComponent() 函数编码的 URI 进行解码
//不会对 ASCII 字母和数字进行编码
//也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )
//但是其他字符,比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都会被由一个或多个十六进制的转义序列替换
encodeURIComponent(URIstring)
例如:
var test1="http://www.w3school.com.cn/My first/?中国"
encodeURIComponent(test1) //http%3A%2F%2Fwww.w3school.com.cn%2FMy%20first%2F%3F%E4%B8%AD%E5%9B%BD
decodeURIComponent(test1) //http://www.w3school.com.cn/My first/?中国