UCS-2 字碼轉 UTF-8

最近碰到要處理經過 UCS-2 編碼過的字串, 幸好不會太困難 。 不過我對 unicode 相關的東西, 只是一知半解, 下面純為紀錄, 有問題煩請糾正 :p

這個 UCS-2 編碼字串看起來像是這個樣子
4F60597D002C901988E1662F6E2C8A66

其實是指

你好,這裡是測試

而在 UCS-2 中, 一個字固定是由 4 個 Bytes 所組成, 所以我們可以將這個 UCS-2 字串拆成像下面這樣, 看起來會比較清楚。

4F60 597D 002C 9019 88E1 662F 6E2C 8A66

可以到 Unihan Database 輸入4F60 看看, 就會得到「你」這個字, 跟其他相關資料。

anyway, 我在 php chr 函式的 comments 找到下面這個函式, 可以用來把 unicode 字碼轉成 utf-8 字元。

function unichr($c) {  
    if ($c <= 0x7F) {
        return chr($c);
    } else if ($c > 6) . chr(0x80 | $c & 0x3F);
    } else if ($c > 12) . chr(0x80 | $c >> 6 & 0x3F)
                                    . chr(0x80 | $c & 0x3F);
    } else if ($c > 18) . chr(0x80 | $c >> 12 & 0x3F)
                                    . chr(0x80 | $c >> 6 & 0x3F)
                                    . chr(0x80 | $c & 0x3F);
    } else {
        return false;
    }
}

而由於上面這個函式只能用來轉換一個字, 所以我就寫了下面這個函式來轉換整個字串

function unistr($str) {  
    $code = str_split($str, 4);

{gfm-js-extract-pre-1}<p>}<br></br></p>```
所以就可以把 UCS-2 編碼的字串丟進這個 unistr 函式進行轉換, 就可以得到 UTF-8 的字串, 如下:  

$ucs2 = '4F60597D002C901988E1662F6E2C8A66';

$utf8 = unistr($ucs2);

echo $utf8; // 你好,這裡是測試```

總之, 我還得多了解 unicode 阿!!~~~

更新:
感謝 gslin 大神在 comments 上留了一筆, 剛才試了一下, 在 pack 處理過, 進行 iconv 時, 用 UTF-16BE 來轉成 UTF-8 即可正常轉換字碼。

$str = '4F60597D002C901988E1662F6E2C8A66';<br></br> $rawstr = pack('H*', $str);<br></br> echo iconv('UTF-16BE', 'UTF-8', $rawstr), "n";

感謝大神!

[延伸閱讀]

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!