2009年7月23日 星期四

[Linux] 如何 hex 字串 與 文字互轉

同事在處理編解碼的問題
拿了個字串 "5F20",說它是 "张" 這個字
一看就大概猜到是 UTF16
可是怎麼得到答案呢?

實在不想寫程式,就直接透過 shell 指令來試試看
然後找到 xxd 這個指令
因為是 utf16,所以就算透過 xxd 得到後,也要再透過 iconv 由 utf16 轉回到 utf8

$echo "205F" | xxd -r -p|iconv -f utf16 -t utf8

xxd 預設吃的順序是 FFFE(小尾序,代表第二 byte 先讀)
所以原來的 5F20 要改成 205F

那自己加上 BOM "FEFF" 讓它變成大尾序呢?
$echo "feff5F20" | xxd -r -p|iconv -f utf16 -t utf8

答案是可以的

原來的 "205F" 和 "FFFE205F" 結果是相同的
$echo "FFFE205F" | xxd -r -p|iconv -f utf16 -t utf8


也可以由文字反查出 utf16 字串,但終端機的文字還是必須由 utf8 轉為 utf16
$echo "张"|iconv -f utf8 -t utf16|xxd
0000000: fffe 205f 0a00

得到的結果,就看到前面的 fffe ,代表了是小尾序

如果用 hexdump ,則會得到大尾序的結果
$echo "张"|iconv -f utf8 -t utf16|hexdump
0000000 feff 5f20 000a
0000006


延伸:
如何還原 8 bit 字串

0 回應:

 
TEMPLATE HACKS AND TWEAKS BY [ METAMUSE ] BLACKCAT 1.1