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 相关文章推荐
web 页面分页打印的实现
Jun 22 Javascript
javascript 哈希表(hashtable)的简单实现
Jan 20 Javascript
jquery.validate使用攻略 第一部
Jul 01 Javascript
基于Jquery的仿照flash放大图片效果代码
Mar 16 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
Sep 14 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
js实现有时间限制消失的图片方法
Feb 27 Javascript
JavaScript奇技淫巧44招【实用】
Dec 11 Javascript
微信小程序 自定义Toast实例代码
Jun 12 Javascript
React-Native中禁用Navigator手势返回的示例代码
Sep 09 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 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中的数组操作函数整理
2008/08/18 PHP
php 移除数组重复元素的一点说明
2008/11/27 PHP
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
JS实现分页导航效果
2020/02/19 Javascript
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
python使用udp实现聊天器功能
2018/12/10 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
python模块如何查看
2020/06/16 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
优秀员工推荐信
2014/05/10 职场文书
冬季施工防火方案
2014/05/17 职场文书
个人承诺书格式
2014/06/03 职场文书
九一八事变演讲稿
2014/09/05 职场文书
个人收入证明模板
2014/09/18 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
迎新生晚会主持词
2015/06/30 职场文书
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android