2020
Oct
30
big5 url encoded string to utf8 string
如何把 url encode 過的 big5 編碼轉換成 utf8 字串, "水泥"這兩個字的 big5 編碼,透過 urlencode 後會是 %A4%F4%AAd
,%A4%F4 代表"水",%AAd
代表泥, %AA 是泥的第一個 byte ,"d
" 是泥的第二個 byte ,正常第二個 byte 應該要是 %64 但是這個編碼剛好在 ASCII 是一個字元 d
,所以泥這字 urlencode 後才變成 "%AAd"
當我收到 big5 編碼 %A4%F4%AAd
轉回 "水泥
" 程式如下:
Example
- var Iconv = require('iconv').Iconv;
- var iconvToUtf8 = new Iconv('Big5', 'UTF8');
- var encoded = "%A4%F4%AAd";
- var decoded = urlDecodeBytes(encoded);
- bufUtf8 = iconvToUtf8.convert(decoded);
- console.log(bufUtf8);
- console.log("bufUtf8 ", new String(bufUtf8, "UTF8"));
- function urlDecodeBytes(encoded) {
- let decoded = Buffer.from('')
- for (let i = 0; i < encoded.length; i++) {
- if (encoded[i] === '%') {
- const charBuf = Buffer.from(`${encoded[i + 1]}${encoded[i + 2]}`, 'hex')
- decoded = Buffer.concat([decoded, charBuf])
- i += 2
- } else {
- const charBuf = Buffer.from(encoded[i])
- decoded = Buffer.concat([decoded, charBuf])
- }
- }
- return decoded
- }
- function isUrlSafe(char) {
- return /[a-zA-Z0-9\-_~.]+/.test(char)
- }
Example
- // 執行結果
- node convert.js
- <Buffer e6 b0 b4 e6 b3 a5>
- bufUtf8 [String: '水泥']
Node.js iconv module 轉換編碼並沒有什麼問題,這段程式碼主要是做 urldecode ,判斷字串中是否有 "%" ,如果沒有就幫它補上 (將 d 轉成 %64
) ,最後存到 node Buffer ,再利用 iconv 轉換編碼。