当前位置: 首页 > 图文教程 > 网络编程 > Javascript > lib.utf.js

Javascript
javascript动画效果类封装代码
javascript关于复选框的实用脚本代码
javascript使用Dom改变超链接前面文本框的值
javascript select列表内容按字母倒序排序与按列表倒序排列
(兼容ff/ie)td点击背景变色特效
javascript跟随滚动条滚动的层(浮动AD效果)
javascript按指定格式输出文件最后更新时间
javascript实现的一个自定义长度的文本自动换行的函数。
javascript模仿百万格子小的一小段代码
兼容FireFox 用javascript写的一个画图函数
javascript写的一个表单动态输入提示的代码
不错的用resizeTo和moveTo两个函数实现窗口的“打乒乓球”效果
javascript一个判断浏览器类型的函数(类)
不错的用外部Javascript修正特定网页内容
找到了一篇jQuery与Prototype并存的冲突的解决方法
070823更新的一个[消息提示框]组件 兼容ie7
错误剖析之JavaScript的9个陷阱及评点
推荐一些非常不错的javascript学习资源站点
出现“不能执行已释放的Script代码”错误的原因及解决办法
给Javascript数组插入一条记录的代码

Javascript 中的 lib.utf.js


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 32 ::
收藏到网摘: n/a

/* UTF-8 <=> UTF-16 convertion library.
*
/* Copyright (C) 1999 Masanao Izumo <[email protected]>
* 2007 Ma Bingyao <[email protected]>
* Version: 2.1
* LastModified: Feb 25, 2007
* This library is free. You can redistribute it and/or modify it.
*/


/*
* Interfaces:
* utf8 = utf16to8(utf16);
* utf16 = utf16to8(utf8);
*/


function utf16to8(str) {
if (str.match(/^[\x00-\x7f]*$/) != null) {
return str;
}
var out, i, j, len, c, c2;
out = [];
len = str.length;
for (i = 0, j = 0; i < len; i++, j++) {
c = str.charCodeAt(i);
if (c <= 0x7f) {
out[j] = str.charAt(i);
}
else if (c <= 0x7ff) {
out[j] = String.fromCharCode(0xc0 | (c >>> 6),
0x80 | (c & 0x3f));
}
else if (c < 0xd800 || c > 0xdfff) {
out[j] = String.fromCharCode(0xe0 | (c >>> 12),
0x80 | ((c >>> 6) & 0x3f),
0x80 | (c & 0x3f));
}
else {
if (++i < len) {
c2 = str.charCodeAt(i);
if (c <= 0xdbff && 0xdc00 <= c2 && c2 <= 0xdfff) {
c = ((c & 0x03ff) << 10 | (c2 & 0x03ff)) + 0x010000;
if (0x010000 <= c && c <= 0x10ffff) {
out[j] = String.fromCharCode(0xf0 | ((c >>> 18) & 0x3f),
0x80 | ((c >>> 12) & 0x3f),
0x80 | ((c >>> 6) & 0x3f),
0x80 | (c & 0x3f));
}
else {
out[j] = '?';
}
}
else {
i--;
out[j] = '?';
}
}
else {
i--;
out[j] = '?';
}
}
}
return out.join('');
}


function utf8to16(str) {
if ((str.match(/^[\x00-\x7f]*$/) != null) ||
(str.match(/^[\x00-\xff]*$/) == null)) {
return str;
}
var out, i, j, len, c, c2, c3, c4, s;


out = [];
len = str.length;
i = j = 0;
while (i < len) {
c = str.charCodeAt(i++);
switch (c >> 4) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxx xxxx
out[j++] = str.charAt(i - 1);
break;
case 12: case 13:
// 110x xxxx 10xx xxxx
c2 = str.charCodeAt(i++);
out[j++] = String.fromCharCode(((c & 0x1f) << 6) |
(c2 & 0x3f));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
c2 = str.charCodeAt(i++);
c3 = str.charCodeAt(i++);
out[j++] = String.fromCharCode(((c & 0x0f) << 12) |
((c2 & 0x3f) << 6) |
(c3 & 0x3f));
break;
case 15:
switch (c & 0xf) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
c2 = str.charCodeAt(i++);
c3 = str.charCodeAt(i++);
c4 = str.charCodeAt(i++);
s = ((c & 0x07) << 18) |
((c2 & 0x3f) << 12) |
((c3 & 0x3f) << 6) |
(c4 & 0x3f) - 0x10000;
if (0 <= s && s <= 0xfffff) {
out[j] = String.fromCharCode(((s >>> 10) & 0x03ff) | 0xd800,
(s & 0x03ff) | 0xdc00);
}
else {
out[j] = '?';
}
break;
case 8: case 9: case 10: case 11:
// 1111 10xx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx
i+=4;
out[j] = '?';
break;
case 12: case 13:
// 1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx
i+=5;
out[j] = '?';
break;
}
}
j++;
}
return out.join('');
}