zoukankan      html  css  js  c++  java
  • JS中UTF-8和UTF-16互转

    1.由于服务端使用的Go,默认是使用UTF-8编码的,而JS默认是Unicode编码的(也就是UTF-16),所以为了字符串编码的一致性,将前端字符串数据编码转换为UTF-8之后再发送给服务端,服务端发送过来的字符串数据转换回UTF-16再使用。

    PS:关于编码可参考《关于编码:Unicode/UTF-8/UTF-16/UTF-32

     

    2.UTF-16转UTF-8

                var utf16ToUtf8 = function (utf16Str) {
                    var utf8Arr = [];
                    var byteSize = 0;
                    for (var i = 0; i < utf16Str.length; i++) {
                        //获取字符Unicode码值
                        var code = utf16Str.charCodeAt(i);
    
                        //如果码值是1个字节的范围,则直接写入
                        if (code >= 0x00 && code <= 0x7f) {
                            byteSize += 1;
                            utf8Arr.push(code);
    
                            //如果码值是2个字节以上的范围,则按规则进行填充补码转换
                        } else if (code >= 0x80 && code <= 0x7ff) {
                            byteSize += 2;
                            utf8Arr.push((192 | (31 & (code >> 6))));
                            utf8Arr.push((128 | (63 & code)))
                        } else if ((code >= 0x800 && code <= 0xd7ff)
                            || (code >= 0xe000 && code <= 0xffff)) {
                            byteSize += 3;
                            utf8Arr.push((224 | (15 & (code >> 12))));
                            utf8Arr.push((128 | (63 & (code >> 6))));
                            utf8Arr.push((128 | (63 & code)))
                        } else if(code >= 0x10000 && code <= 0x10ffff ){
                            byteSize += 4;
                            utf8Arr.push((240 | (7 & (code >> 18))));
                            utf8Arr.push((128 | (63 & (code >> 12))));
                            utf8Arr.push((128 | (63 & (code >> 6))));
                            utf8Arr.push((128 | (63 & code)))
                        }
                    }
    
                    return utf8Arr
                }

    3.UTF-8转UTF-16

                var utf8ToUtf16 = function (utf8Arr) {
                    var utf16Str = '';
    
                    for (var i = 0; i < utf8Arr.length; i++) {
                        //每个字节都转换为2进制字符串进行判断
                        var one = utf8Arr[i].toString(2);
    
                        //正则表达式判断该字节是否符合>=2个1和1个0的情况
                        var v = one.match(/^1+?(?=0)/);
    
                        //多个字节编码
                        if (v && one.length == 8) {
                            //获取该编码是多少个字节长度
                            var bytesLength = v[0].length;
    
                            //首个字节中的数据,因为首字节有效数据长度为8位减去1个0位,再减去bytesLength位的剩余位数
                            var store = utf8Arr[i].toString(2).slice(7 - bytesLength);
                            for (var st = 1; st < bytesLength; st++) {
                                //后面剩余字节中的数据,因为后面字节都是10xxxxxxx,所以slice中的2指的是去除10
                                store += utf8Arr[st + i].toString(2).slice(2)
                            }
    
                            //转换为Unicode码值
                            utf16Str += String.fromCharCode(parseInt(store, 2));
    
                            //调整剩余字节数
                            i += bytesLength - 1
                        } else {
                            //单个字节编码,和Unicode码值一致,直接将该字节转换为UTF-16
                            utf16Str += String.fromCharCode(utf8Arr[i])
                        }
                    }
    
                    return utf16Str
                }

    参考网址:《通过javascript进行UTF-8编码的实现方法

    以上。

  • 相关阅读:
    EML格式解析及其访问实现
    Windows Live Writer测试
    这几天为搬房子的事烦死了。
    今天装MSSQL2005时发现有些安装文件要跟2000共享(无法更改安装盘符)
    今天看到一段比较有意思的JS脚本,根据访问速度来选择镜像。
    MS的帮助越来越多视频了。
    邹健写的公交车路线查询(包括转车近到远排列)。
    今天终于搬到这边住了,就是感觉贵了点。
    第一次看到银行系统用DotNet来做。
    这几天上火了
  • 原文地址:https://www.cnblogs.com/chevin/p/8424842.html
Copyright © 2011-2022 走看看