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实现页面实时显示当前时间的简单实例
Jul 20 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
Feb 04 Javascript
让alert不出现弹窗的两种方法
May 18 Javascript
JS实现兼容性较好的随屏滚动效果
Nov 09 Javascript
理解javascript中try...catch...finally
Dec 25 Javascript
JavaScript函数中关于valueOf和toString的理解
Jun 14 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
微信小程序商城项目之侧栏分类效果(1)
Apr 17 Javascript
浅谈vuejs实现数据驱动视图原理
Feb 23 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 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制作静态网站的模板框架(一)
2006/10/09 PHP
php 设计模式之 单例模式
2008/12/19 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
Python判断Abundant Number的方法
2015/06/15 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
社区十八大感言
2014/01/19 职场文书
银行求职自荐信
2014/06/30 职场文书
合同和协议有什么区别?
2014/10/08 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js