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 相关文章推荐
JavaScript Event学习第八章 事件的顺序
Feb 07 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
Sep 03 Javascript
图片在浏览器中底部对齐 解决方法之一
Nov 30 Javascript
Extjs中ComboBox加载并赋初值的实现方法
Mar 22 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
javascript背景时钟实现方法
Jun 18 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
Nov 25 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
Sep 21 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
js仿小米手机上下滑动效果
Feb 05 Javascript
基于LayUI实现前端分页功能的方法
Jul 22 Javascript
基于node.js express mvc轻量级框架实践
Sep 14 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
Parse正式发布开源PHP SDK
2014/08/11 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
python实现数据写入excel表格
2018/03/25 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
python 项目目录结构设置
2020/02/14 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
普师专业个人自荐信范文
2013/11/26 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
宾馆安全管理制度
2015/08/06 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Python内置数据类型中的集合详解
2022/03/18 Python