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 相关文章推荐
28个JS验证函数收集
Mar 02 Javascript
Asp.Net alert弹出提示信息的几种方法总结
Jan 29 Javascript
jquery判断类型是不是number类型的实例代码
Oct 07 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
Oct 28 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
Jan 24 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
Apr 14 Javascript
layui table 参数设置方法
Aug 14 Javascript
详解vue项目接入微信JSSDK的坑
Dec 14 Javascript
小程序hover-class点击态效果实现
Feb 26 Javascript
JS学习笔记之闭包小案例分析
May 29 Javascript
微信小程序-可移动菜单的实现过程详解
Jun 24 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
JavaScript中的return语句简单介绍
2015/12/07 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
Python 代码性能优化技巧分享
2012/08/07 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
python生成requirements.txt的两种方法
2019/09/18 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
局域网定义和特性
2016/01/23 面试题
玩具公司的创业计划书
2013/12/31 职场文书
教师旷工检讨书
2014/01/18 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
安全生产月标语
2014/10/07 职场文书
家庭困难证明
2014/10/12 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
考勤制度通知
2015/04/25 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL