lib.utf.js


Posted in Javascript onAugust 21, 2007
/* UTF-8 <=> UTF-16 convertion library.
 *
/* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
 * 2007 Ma Bingyao <andot@ujn.edu.cn>
 * 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('');
}
Javascript 相关文章推荐
AngularJS 输入验证详解及实例代码
Jul 28 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
关于vue.js v-bind 的一些理解和思考
Jun 06 Javascript
JavaScript事件方法(实例讲解)
Jun 27 Javascript
详细分析单线程JS执行问题
Nov 22 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
Dec 11 Javascript
js中对象和面向对象与Json介绍
Jan 21 Javascript
Vue起步(无cli)的啊教程详解
Apr 11 Javascript
JS实现随机点名器
Apr 12 Javascript
JavaScript实现10秒后再次获取验证码
Dec 02 Javascript
ES6中的类(Class)示例详解
Dec 09 Javascript
javascript实现上传图片前的预览(TX的面试题)
Aug 20 #Javascript
fix-ie5.js扩展在IE5下不能使用的几个方法
Aug 20 #Javascript
关于恒等于(===)和非恒等于(!==)
Aug 20 #Javascript
图片格式的JavaScript和CSS速查手册
Aug 20 #Javascript
javascript 一个自定义长度的文本自动换行的函数
Aug 19 #Javascript
js类中获取外部函数名的方法
Aug 19 #Javascript
写了一个layout,拖动条连贯,内容区可为iframe
Aug 19 #Javascript
You might like
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
PHP计数器的实现代码
2013/06/08 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
js的with语句使用方法
2007/09/21 Javascript
js操作select控件的几种方法
2010/06/02 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
详解vue中组件参数
2018/07/09 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python列表推导式的使用方法
2013/11/21 Python
python将字符串转换成数组的方法
2015/04/29 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
numpy排序与集合运算用法示例
2017/12/15 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
python 求定积分和不定积分示例
2019/11/20 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
销售人员自我评价怎么写
2013/09/19 职场文书
地理科学专业毕业生求职信
2013/10/15 职场文书
高考自主招生自荐信
2013/10/20 职场文书
公司年终奖分配方案
2014/06/16 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL