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 相关文章推荐
js 利用image对象实现图片的预加载提高访问速度
Mar 29 Javascript
jQuery过滤选择器:not()方法使用介绍
Apr 20 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
Oct 16 Javascript
jquery实现不包含当前项的选择器实例
Jun 25 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
Mar 21 Javascript
Bootstrap CSS组件之导航条(navbar)
Dec 17 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
JavaScript中Require调用js的实例分享
Oct 27 Javascript
JS根据json数组多个字段排序及json数组常用操作
Jun 06 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
Aug 23 Javascript
24个ES6方法解决JS实际开发问题(小结)
May 31 Javascript
vue中是怎样监听数组变化的
Oct 24 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 使用array函数实现分页
2015/02/13 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
jQuery 解析xml文件
2009/08/09 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
Python模块搜索路径代码详解
2018/01/29 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
对python sklearn one-hot编码详解
2018/07/10 Python
python生成lmdb格式的文件实例
2018/11/08 Python
python调用staf自动化框架的方法
2018/12/26 Python
Python远程linux执行命令实现
2020/11/11 Python
Python的collections模块真的很好用
2021/03/01 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
一些Unix笔试题和面试题
2013/01/22 面试题
UML设计模式笔试题
2014/06/07 面试题
涉外文秘个人求职的自我评价
2013/10/07 职场文书
产品开发计划书
2014/04/27 职场文书
应届大专生求职信
2014/06/26 职场文书
离职报告格式
2014/11/04 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js
Go语言编译原理之源码调试
2022/08/05 Golang