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 相关文章推荐
表单切换,用回车键替换Tab健(不支持IE)
Jul 20 Javascript
MooBox 基于Mootools的对话框插件
Jan 20 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 Javascript
node文件批量重命名的方法示例
Oct 23 Javascript
JS简单获得节点元素的方法示例
Feb 10 Javascript
vue.js使用3DES加密的方法示例
May 18 Javascript
Vue 中的受控与非受控组件的实现
Dec 17 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
JS实现随机抽选获奖者
Nov 07 Javascript
angular4实现带搜索的下拉框
Mar 25 Javascript
JS轻量级函数式编程实现XDM二
Jun 16 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
php命令行用法入门实例教程
2014/10/27 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
简明 Python 基础学习教程
2007/02/08 Python
利用python代码写的12306订票代码
2015/12/20 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
Python之web模板应用
2017/12/26 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python矩阵的转置和逆转实例
2018/12/12 Python
python 字段拆分详解
2019/12/17 Python
python 星号(*)的多种用途
2020/09/21 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
毕业证丢失证明
2014/01/15 职场文书
学生会竞聘书范文
2014/03/31 职场文书