js處理16進製制hex轉str出現的中文亂碼問題

2021-10-19 12:00:37 字數 1844 閱讀 1717

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

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

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

çæ¥å¿«æ¨å  //這到底是什麼鬼東西
後來注意到一件小事情是,他所有的16進製資料都是\u00開頭,或許意味著只有後兩位有意義?於是我把字頭全部取代後得到下面的結果

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

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

以我上面分享的第乙個字為例子

前三碼e7 94 9f轉成二進位制的資料呈現以下的樣子

11100111 10010100 10011111
第一組前面有3個1,代表這個字要用到三個位元組

扣除記錄這個資訊的區塊後,剩下的00111即為第一塊資料區

第二組為延續位元組,其前兩碼固定為10,後面的010100即為資料區

第三組為延續位元組,其前兩碼固定為10,後面的011111即為資料區

三組資料全部拼起來00111010100011111就是這個字的 utf-8 碼

把這個二進位制資料轉回 int 後再轉成 char 就會看到正確的中文字了

string.fromcharcode(parseint('00111010100011111',2)) //'生'
最後就是把上面的邏輯寫成程式碼了

function hex2a(hexx) 

function decode(text)

let str = "";

for (let i = 0; i < bytearr.length;)

str += string.fromcharcode(parseint(body, 2));

i += byteslength;

} else

}return str;

}aa=decode("\u00e7\u0094\u009f\u00e6\u0097\u00a5"); // returns '2460'

console.log(aa)

view raw

byte-array-to-string.js hosted with ❤ by github

16進製制轉8進製

很有意思。開始沒注意題直接 x o 然後看到了 這個16進製制的數長度不超過100000 妥妥又是高精度問題。還有個錯誤就是把二進位制左右反了,導致半天找不出錯。然後就把二進位制打出來,找到了。大體思路就是16 2 8 如 f 1111 17 ff 1111 1111 011 111 111 377...

16進製制轉8進製

16進製制轉8進製 思路 16進製制轉成2進製串,2進製串從後每3位轉成8進製串 include include define maxn 10 define maxlength 100000 int main else bi k 0 if temp 4 else bi k 0 if temp 2 e...

16進製制轉10

請設計程式實現如下功能 從鍵盤輸入乙個不超過8位的正的十六進製制數字串,將它轉換為正的十進位制數後輸出。注 十六進製制數中的10 15分別用大寫的英文本母a b c d e f表示。樣例輸入 ffff 樣例輸出 65535 include include include using namespac...