lib.utf.js

所属分类: 网络编程 / JavaScript 阅读数: 332
收藏 0 赞 0 分享
/* 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('');
}
更多精彩内容其他人还在看

layui table 复选框跳页后再回来保持原来选中的状态示例

今天小编就为大家分享一篇layui table 复选框跳页后再回来保持原来选中的状态示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Vue-Cli项目优化操作的实现

这篇文章主要介绍了Vue-Cli项目优化操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题

这篇文章主要介绍了解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题,本文给大家总结的非常详细,需要的朋友可以参考下
收藏 0 赞 0 分享

vue 父组件通过v-model接收子组件的值的代码

这篇文章主要介绍了vue 父组件通过v-model接收子组件的值的代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

vue 全局环境切换问题

小编在开发使经常会碰到全局切换问题,今天小编给大家带来一篇教程给大家介绍vue 全局环境切换问题,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

element-ui 本地化使用教程详解

这篇文章主要介绍了element-ui 本地化使用教程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

在Vue项目中,防止页面被缩放和放大示例

今天小编就为大家分享一篇在Vue项目中,防止页面被缩放和放大示例,具有很好的参考 价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

vue h5移动端禁止缩放代码

今天小编就为大家分享一篇vue h5移动端禁止缩放代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Vue 3.0双向绑定原理的实现方法

这篇文章主要为大家详细介绍了Vue 3.0双向绑定原理的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

nest.js 使用express需要提供多个静态目录的操作方法

这篇文章主要介绍了nest.js 使用express需要提供多个静态目录的操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享
查看更多