解决qrcode解析二维码中文乱码问题(js中文乱码)

// UCS-2和UTF8都是unicode的一种编码方式
// js代码中使用的是UCS-2编码

1、 // UCS-2和UTF8都是unicode的一种编码方式
// js代码中使用的是UCS-2编码
js的编码方式

2、
这里写图片描述

3、str2utf8:
1)字符转USC-2,用charCodeAt()
2)如英文的话,直接返回字符str.charAt(i);//返回指定位置的字符
3)如中文的话,根据Unicode、utf-8编码方式的编码规则图,用String.fromCharCode转换
UCS-2转UTF-8

    function str2utf8(str)
    {
        // UCS-2和UTF8都是unicode的一种编码方式
        // js代码中使用的是UCS-2编码

        var code;
        var utf = "";

        for (var i = 0; i < str.length; i++)
        {
            code = str.charCodeAt(i);//返回每个字符的Unicode 编码

            if (code < 0x0080) {
                utf += str.charAt(i);//返回指定位置的字符
            }
            else if (code < 0x0800) {
                utf += String.fromCharCode(0xC0 | ((code >> 6) & 0x1F));
                utf += String.fromCharCode(0x80 | ((code >> 0) & 0x3F));
            }
            else if (code < 0x10000) {
                utf += String.fromCharCode(0xE0 | ((code >> 12) & 0x0F));
                utf += String.fromCharCode(0x80 | ((code >>  6) & 0x3F));
                utf += String.fromCharCode(0x80 | ((code >>  0) & 0x3F));
            }
            else
            {
                throw "不是UCS-2字符集"
            }

        }
        return utf;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32

4、utf82str:UTF-8转USC-2

  function utf82str(utf)
    {
        var str = "";
        var tmp;

        for(var i = 0; i < utf.length; i++)
        {
            // 英文字符集合
            if(utf.charCodeAt(i) >> 7 == 0x00)
            {
                str += utf.charAt(i);
                continue;
            }
            // 其他字符集
            else if(utf.charCodeAt(i) >> 5 == 0x06)
            {
                tmp = ((utf.charCodeAt(i + 0) & 0x1f) << 6) |
                      ((utf.charCodeAt(i + 1) & 0x3f) << 0);
                str += String.fromCharCode(tmp);
                i++;
                continue;
            }
            // 中文字符集
            else if(utf.charCodeAt(i) >> 4 == 0x0e)
            {
                tmp = ((utf.charCodeAt(i + 0) & 0x0f) << 12) |
                      ((utf.charCodeAt(i + 1) & 0x3f) <<  6) |
                      ((utf.charCodeAt(i + 2) & 0x3f) <<  0);
                str += String.fromCharCode(tmp);
                i += 2;
                continue;
            }
            // 其他字符集
            else if(utf.charCodeAt(i) >> 3 == 0x1f)
            {
                tmp = ((utf.charCodeAt(i + 0) & 0x07) << 18) |
                      ((utf.charCodeAt(i + 1) & 0x3f) << 12) |
                      ((utf.charCodeAt(i + 2) & 0x3f) <<  6);
                      ((utf.charCodeAt(i + 3) & 0x3f) <<  0);
                str += String.fromCharCode(tmp);
                i += 3;
                continue;
            }
            // 非法字符集
            else
            {
                throw "不是UTF-8字符集"
            }
        }

        return str;
    }

原文:https://blog.csdn.net/jiajia199470/article/details/77101297
 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值