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 相关文章推荐
img标签中onerror用法
Aug 13 Javascript
让div层随鼠标移动的实现代码 ie ff
Dec 18 Javascript
node.js不得不说的12点内容
Jul 14 Javascript
javascript函数中参数传递问题示例探讨
Jul 31 Javascript
AngularJS实现路由实例
Feb 12 Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
Aug 22 Javascript
Node.js 多线程完全指南总结
Mar 27 Javascript
js中的深浅拷贝问题简析
May 10 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
vue中使用element组件时事件想要传递其他参数的问题
Sep 18 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 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 读取文本文件内容并分页显示
2016/01/02 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
跟老齐学Python之数据类型总结
2014/09/24 Python
python实现堆栈与队列的方法
2015/01/15 Python
Mac 上切换Python多版本
2017/06/17 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
python修改FTP服务器上的文件名
2019/09/11 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
函授本科自我鉴定
2013/11/03 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
OpenCV 图像梯度的实现方法
2021/07/25 Python
详解Vue slot插槽
2021/11/20 Vue.js
Java详细解析==和equals的区别
2022/04/07 Java/Android