js处理16进制hex转str出现的中文乱码问题

昨天從FB下載了一份包含所有對話紀錄的JSON檔,但裡面的中文字編碼有問題,通通變成下面這個樣子

 

"\u00e7\u0094\u009f\u00e6\u0097\u00a5"

本來想說這種事情應該很簡單,就把他每個字元當成char轉存不就得了,結果轉出來的東西從網頁上看還是一團亂碼…

錯誤的嘗試

既然轉換之後仍然是亂碼,那至少代表這個編碼不是utf-8,那會不會是big5或其他現在比較少看到的編碼呢?所以我試著切換 html 檔的 charset,但仍然得到錯誤的結果

çæ¥å¿«æ¨å  //這到底是什麼鬼東西

整理思路

後來注意到一件小事情是,他所有的16進位資料都是\u00開頭,或許意味著只有後兩位有意義?於是我把字頭全部取代後得到下面的結果

E7 94 9F E6 97 A5

這東西看起來很像是在使用記憶體修改器會看到的東西,於是我稍微有思緒了:他實際上應該是byte[]。也循線找到了網站測試證明了我的想法是正確的

Hex decoder: Online hexadecimal to text converter

byte array to string

搞懂他到底是什麼編碼格式之後,就是要開始寫轉檔程式了(總不能一行一行貼上去面的網站翻譯吧)在 stackoverflow 上有這麼一篇提問:How to convert UTF8 string to byte array? 下方的解答有人分享了轉換的規則:

  • 多位元組的情形下,第一個位元組前面1的數量即代表該字元所需要的位元組數量。扣除這個資訊所占用的位元後剩下的位元即為資料區塊
  • 後面接著的延續位元組,其格式固定為10字頭,後面的六個位元為資料區塊
  • 將所有的資料區塊全部拼起來即為utf-8

以我上面分享的第一個字為例子
前三碼E7 94 9F轉成二進制的資料呈現以下的樣子

11100111 10010100 10011111
  1. 第一組前面有3個1,代表這個字要用到三個位元組
  2. 扣除記錄這個資訊的區塊後,剩下的00111即為第一塊資料區
  3. 第二組為延續位元組,其前兩碼固定為10,後面的010100即為資料區
  4. 第三組為延續位元組,其前兩碼固定為10,後面的011111即為資料區
  5. 三組資料全部拼起來00111010100011111就是這個字的 utf-8 碼
  6. 把這個二進制資料轉回 int 後再轉成 char 就會看到正確的中文字了
    String.fromCharCode(parseInt('00111010100011111',2)) //'生'
    

寫成程式

最後就是把上面的邏輯寫成程式碼了


function hex2a(hexx) {var hex = hexx.toString();//force conversionvar str = '';for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2)str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));return str;
}function decode(text) {if (!text)return "";//string to byte[]let byteArr = [];for (let i = 0; i < text.length; i++) {byteArr.push(text.charCodeAt(i));}let str = "";for (let i = 0; i < byteArr.length;) {let binary = byteArr[i].toString(2);let head = binary.match(/^1+?(?=0)/);if (head && binary.length == 8) {//該字元需要幾個位元組let bytesLength = head[0].length;//第一個位元組的實際資料區                 let body = binary.slice(bytesLength);for (let j = 1; j < bytesLength; j++) {//組合資料body += byteArr[i + j].toString(2).slice(2);}str += String.fromCharCode(parseInt(body, 2));i += bytesLength;} else {str += String.fromCharCode(byteArr[i]);i++;}}return str;
}aa=decode("\u00e7\u0094\u009f\u00e6\u0097\u00a5"); // returns '2460'console.log(aa)

view rawbyte-array-to-string.js hosted with ❤ by GitHub

後記

  • 好久沒有碰到需要直接操作位元的問題,大學修的計概都還給教授了Orz
  • 組資料的地方如果可以直接用<<>>進行位元計算性能應該會比字串處理提升很多,改天再來修改程式碼吧。
  • 實測發現emoji轉不出來🤔🤔🤔

任何程序错误,以及技术疑问或需要解答的,请添加

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 6.2 本地安装YUM

一般学习linux的同学都是先学习的Red hat吧&#xff0c;小编也是如此&#xff0c;但是在生产环境中&#xff0c;大多数企业用的是基于redhat 内核的 centos &#xff0c;小编最近在接触centos时&#xff0c;就发现了不少问题&#xff0c;今天先从本地YUM说起。 redhat配置本地Y…

MFC设置对话框背景色及控件颜色

MFC设置对话框背景色及控件颜色 一、使用背景图片更改对话框背景色 在对话框源文件void CxxDlg::OnPaint()函数中 if (IsIconic()) { (这里省略) } else { CDialogEx::OnPaint(); } else里面添加下列代码&#xff1a; 效果如下图所示&#xff1a; 二、使用颜色更改对话…

Stacked Hourglass Networks 人体姿态检测

本文是人体关键点中非常经典的一篇文章&#xff1a;Stacked Hourglass Networks for Human Pose Estimation 论文地址&#xff1a; https://arxiv.org/abs/1603.06937​arxiv.org 代码地址&#xff1a; wbenbihi/hourglasstensorlfow​github.com​编辑 论文框图&#xff1…

Xamarin开发笔记—设备类amp;第三方弹窗的使用和注意事项

一、设备类是Xamarin重要开发组成部分&#xff0c;下面介绍一下设备类的主要用法&#xff1a; //唤醒打电话Device.OpenUri(new Uri("tel:180xxxxxxxx"));//打开网页Device.OpenUri(new Uri("http://vipstone.cnblogs.com/"));//判断当前运行平台Device.Ru…

Windows Azure 安全最佳实践 - 第 4 部分:需要采取的其他措施

那么&#xff0c;哪些安全威胁应由WindowsAzure环境缓解&#xff1f;哪些安全威胁必须由开发人员缓解&#xff1f; 开发 Windows Azure 应用程序的最佳安全做法一文说明了对于在 Windows Azure 中运行的应用程序而言&#xff0c;什么样的威胁应被视为主要威胁。它还专门说明了 …

逻辑性最强的React Native环境搭建与调试

ReactNative系列文章&#xff1a; 1.《逻辑性最强的React Native环境搭建与调试》 2.《ReactNative开发工具有这一篇足矣》 正文 React Native&#xff08;以下简称RN&#xff09;&#xff0c;已经“火”了好一段时间了&#xff0c;网上的资料相对也很丰富&#xff0c;只是一…

自绘热点按钮

自绘热点按钮 一、1.在VS2010中新建MFC对话框工程&#xff0c;命名“Test”。 2.删除对话框上所有控件&#xff0c;然后在对话框上添加一个按钮&#xff0c;一个组合框&#xff0c;一个编辑框&#xff0c;更改按钮ID为IDC_TRANSFORM_BTN&#xff0c;更改编辑框ID为IDC_EDIT2。…

YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)

前言 Amusi 发现一个很棒的开源项目&#xff0c;利用YOLOv5进行目标检测的"落地化"应用&#xff1a;安全帽佩戴检测。 该项目使用了YOLOv5s、YOLOv5m、YOLOv5l来训练安全帽佩戴检测数据集&#xff0c;代码和权重均已开源&#xff01;安全帽佩戴检测数据集也是开源的…

centos上安装adobe flash

1、下载adobe yum源rpm包并安装rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpmrpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux2、通过yum命令安装adobe flashyum install flash-plugin nspluginwrapper alsa-plugins-…

linux运行可执行文件,通过c语言调用java的main方法

前言&#xff1a;以前一直在做Android开发&#xff0c;在某本书上看过一句话“Android上面不只有App类的程序可以运行&#xff0c;能在linux下运行的程序&#xff0c;也可以在Android上面运行” 一.编写C语言部分代码 1.定义java.h头文件 #include <jni.h>#ifndef _JAV…

MFC串口通信设置及发送、中断接收程序

前一段做了个串口通信小软件&#xff0c;就是现实利用上位机软件通过串口通信对下位机&#xff08;单片机&#xff09;通信&#xff0c;校时LED点阵万年历&#xff0c;省去按键调节的麻烦&#xff0c;方便校时&#xff0c;省时省力。 为右击 串口通信控件&#xff0c;添加关联…

ReactNative开发工具有这一篇足矣

ReactNative系列文章&#xff1a; 1.《逻辑性最强的React Native环境搭建与调试》 2.《ReactNative开发工具有这一篇足矣》 正文 React Native&#xff08;以下简称RN&#xff09;开发工具的文章很多&#xff0c;几乎千篇一律都是Copy的&#xff08;一毛一样&#xff09;&a…

【K8S】Docker向私有仓库拉取/推送镜像报错(http: server gave HTTP response to HTTPS client)

这里&#xff0c;我们搭建的Harbor仓库的地址为 http://192.168.175.101:1180。 报错信息如下所示。 [rootbinghe101 ~]# docker login 192.168.175.101:1180 Username: binghe Password: Error response from daemon: Get https://192.168.175.101:1180/v2/: http: server …

MFC串口通信串口指示灯的实现

前一段做了个串口通信小软件&#xff0c;当打开串口时串口指示灯亮&#xff0c;关闭串口时串口指示灯灭&#xff0c;实现方法如下&#xff1a; 1.在资源视图中&#xff0c;添加两个图标&#xff0c;分别为串口指示灯灭IDI_ICON1&#xff0c;串口指示灯亮IDI_ICON2。 2.在串口通…

07-Windows Server 2012 R2 会话远程桌面-标准部署-RD授权

Windows Server 2012 R2 会话远程桌面-标准部署-RD授权马博峰当完成所有的部署后&#xff0c;在实际操作中没有任何问题&#xff0c;并完成所有的测试&#xff0c;在所有工作的最后一步就是需要安装RD授权服务器&#xff0c;远程桌面授权&#xff08;RD 授权&#xff09;以前称…

解决React Native unable to load script from assets index.android.bundle on windows

React Native运行的时候&#xff0c;经常碰到React Native unable to load script from assets index.android.bundle on windows解决方法有2种&#xff1a; 方法一&#xff1a;设置IP和端口 具体步骤&#xff1a;报错页面晃动手机&#xff0c;显示菜单 》 点击Dev Settings …

CentOS 安装go client调用Kubernetes API

CentOS 安装 Go环境并配置goproxy wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz tar -xzvf go1.14.4.linux-amd64.tar.gz -C /usr/local/ mkdir -p /home/gopath cat >> /etc/profile <<EOF export GOROOT/usr/local/go export GOPATH/home/gopath…

VS2010中使用sprintf出现warning C4997: 'sprintf': This function or variable may be unsafe.

使用VS2010编译时。会出现以下警告。 warning C4997: sprintf: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files (x86)\microsoft visual …

list使用

1、将两个list合并成一个list&#xff0c;可以用addAll()方法。2、一个list1嵌套list&#xff0c;可以list<bean> listnew ArrayList<bean>();ArrayList<list> list1new ArrayList<list>();lst1.add(list);转载于:https://blog.51cto.com/7533390/1341…

React Native App设置amp;Android版发布

React Native系列 《逻辑性最强的React Native环境搭建与调试》 《ReactNative开发工具有这一篇足矣》 《解决React Native unable to load script from assets index.android.bundle on windows》 《React Native App设置&Android版发布》 一、设置APP信息 1.设置包名…