其實地球上根本就不該存在 Big5 JSON 這種東西
RFC 4627 有提到: JSON text SHALL be encoded in Unicode.
所以像是 PHP 在 json_decode 時,如果遇到非 UTF-8 字元,就會直接噴 NULL 給你,並且跳出 「Malformed UTF-8 characters, possibly incorrectly encoded」,連用都不給你
但是假如很不幸的,就真的拿到了一個 Big5 JSON 怎麼辦?
例如像我現在要用 ogr2ogr 把政府 open data 的資料轉成 GeoJSON ,結果因為他的內容是 Big5 ,產生出來就是 Big5 JSON 了
直接用 iconv 轉,就死在台北市內湖區成功路了
昨天找到一個解決方法是
1.
(如果 LC_CTYPE 預設是 UTF-8 的話,就會在 \x81 這邊出現錯誤,所以改成 c 讓他可以處理任何 binary)
2.
因為 Big5 的 SPEC 有說雙位元字的第一個位元會是 0x81 - 0xfe 之間 ,所以只要針對 [0x81-0xfe] 和 \\ 連在一起的替換成只有一個 \ 就行了
這樣子許功蓋都可以解決了
(都已經快 2014 年了,還要處理 Big5 問題...)
RFC 4627 有提到: JSON text SHALL be encoded in Unicode.
所以像是 PHP 在 json_decode 時,如果遇到非 UTF-8 字元,就會直接噴 NULL 給你,並且跳出 「Malformed UTF-8 characters, possibly incorrectly encoded」,連用都不給你
但是假如很不幸的,就真的拿到了一個 Big5 JSON 怎麼辦?
例如像我現在要用 ogr2ogr 把政府 open data 的資料轉成 GeoJSON ,結果因為他的內容是 Big5 ,產生出來就是 Big5 JSON 了
直接用 iconv 轉,就死在台北市內湖區成功路了
昨天找到一個解決方法是
1.
env LC_CTYPE=c sed -i 's/[\x81-\xFE]\\\)\\/\1/g' {big5_file.json}
(如果 LC_CTYPE 預設是 UTF-8 的話,就會在 \x81 這邊出現錯誤,所以改成 c 讓他可以處理任何 binary)
2.
iconv -f big5 -t utf-8 {big5_file.json}
因為 Big5 的 SPEC 有說雙位元字的第一個位元會是 0x81 - 0xfe 之間 ,所以只要針對 [0x81-0xfe] 和 \\ 連在一起的替換成只有一個 \ 就行了
這樣子許功蓋都可以解決了
(都已經快 2014 年了,還要處理 Big5 問題...)
全站熱搜
留言列表