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 相关文章推荐
toString()一个会自动调用的方法
Feb 08 Javascript
JavaScript 数组运用实现代码
Apr 13 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
javascript中json基础知识详解
Jan 19 Javascript
简单实现bootstrap选项卡效果
Feb 08 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
Oct 30 Javascript
js断点调试心得分享(必看篇)
Dec 08 Javascript
js 图片转base64的方式(两种)
Apr 24 Javascript
解决循环中setTimeout执行顺序的问题
Jun 20 Javascript
解决Vue打包后访问图片/图标不显示的问题
Jul 25 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
Aug 06 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
JS定义函数的几种常用方法小结
2019/05/23 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
python3转换code128条形码的方法
2019/04/17 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
贷款收入证明范本
2015/06/12 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL