Re: [問題] 讀取UTF-8編碼

作者: descent (「雄辯是銀,沉默是金」)   2014-04-19 15:09:16
c++11 有個 unicode 功能, 不過我覺得可能沒想像中好用。
處理 utf8 string, 我覺得 qt 的 qstring 很好用, 你可以試試看,
就算不寫 gui 程式, 我也會用 qstring 來處理 utf8 string,
實在方便不少, 就像用 std::string 那樣的好用。
也許會覺得要處理 utf8 string 得 link qt 這個大東西很恐怖,
不過事實上處理 utf8 就是這麼困難。
https://github.com/descent/progs/tree/master/handle_utf8_string_by_qstring
給你參考。
QApplication app(argc, argv);
就算你不寫 gui 一定也需要宣告 QApplication, 否則中文 utf8 string
會有問題, 我不知道為什麼?
若要處理 xml, 我用過 qt QDomDocument class, 你可以試試看。
※ 引述《wsx100 ()》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: linux, gcc
: 問題(Question):
: 文件是xml
: 採用UTF-8編碼
: 如果用char *[]去處理的話 之後要針對標點符號split會失敗
: 所以我查到用wchar_t *[]去處理
: 可是結果不如預期
: 餵入的資料(Input):
: 底下連結是xml檔案
: https://dl.dropboxusercontent.com/u/100819329/file.zip
: 預期的正確結果(Expected Output):
: <?xml version="1.0" encoding="UTF-8"?>
: <xml>
: <p>
: <id>01</id>
: <p>你好</p>
: 錯誤結果(Wrong Output):
: <?xml version="1.0" encoding="UTF-8"?>
: <xml>
: <p>
: <id>01</id>
: <p>
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: https://gist.github.com/anonymous/11058612
: 補充說明(Supplement):
: 我從下午6點用到晚上2點還沒搞定@@
: 或是有別的方法可以把UTF-8的xml正確讀入呢@@?
: 之後要能夠支援依照標點符號切割成子字串..
: 請高手指點!
: 謝謝
作者: uranusjr (←這人是超級笨蛋)   2014-04-19 16:00:00
其實 QString 本身 dependecies 應該沒有很多(不考慮locale 和 regex 之類有的沒的東西的話), 說不定可以抽出來, 等有空來研究看看好了說真的 QString 應該是我看過最好的 C 相關 Unicode 實作
作者: buganini (霸格尼尼)   2014-04-19 17:30:00
UTF-8並沒有多複雜啊? 如果只是要正確斷字,很簡單就可以辦到了,libchewing裡面有個http://0rz.tw/gNZJo如果是normalize/locale那塊,那大概也是call ICU不是做在QT裡面
作者: descent (「雄辯是銀,沉默是金」)   2014-04-19 17:46:00
有 qstring, 我才不想去用 icu, std::string 要是也能有 qstring 的能力, 那就太棒了
作者: buganini (霸格尼尼)   2014-04-19 17:49:00
目測應該是永遠不會有吧,std::string是char based
作者: uranusjr (←這人是超級笨蛋)   2014-04-19 17:52:00
std::string 根本只是 char array 的包裝而已, 別肖想了
作者: buganini (霸格尼尼)   2014-04-19 17:53:00
正確作法應該是extend std::string加上UTF-8 specific的function
作者: uranusjr (←這人是超級笨蛋)   2014-04-19 17:54:00
如果要有真正的 string abstraction 目標當然就不是 UTF8
作者: buganini (霸格尼尼)   2014-04-19 17:54:00
不過這樣效率也不好,真要處理字串還是解成wchar吧
作者: uranusjr (←這人是超級笨蛋)   2014-04-19 17:55:00
而已, 很多編碼都有一些 quicks 要處理寬字元也不是萬用解, 不要忘記 surrogatepairs 啊...
作者: buganini (霸格尼尼)   2014-04-19 17:58:00
ㄟ 這就尷尬了 wchar有16bits也有32bits orz32bits的話就算萬用了吧
作者: uranusjr (←這人是超級笨蛋)   2014-04-19 18:04:00
32-bit 應該是夠用很長一段時間沒錯啦XD
作者: buganini (霸格尼尼)   2014-04-19 18:05:00
目前有RFC 3629把上限擋在U+10FFFF應該夠用完這輩子了(?)不對 他只擋了UTF-8的上限,沒有說unicode不能超過雖然目前還沒超過,範圍內的空間也還綽綽有餘就是了
作者: uranusjr (←這人是超級笨蛋)   2014-04-19 18:13:00
不過應該這輩子夠用了, 之後反正肯定不是我維護沒差(欸
作者: descent (「雄辯是銀,沉默是金」)   2014-04-19 18:17:00
兩位大大對編碼真熟悉
作者: buganini (霸格尼尼)   2014-04-19 18:21:00
補充一下,U+10FFFF也是UTF-16 surrogate pairs的上限
作者: LPH66 (-6.2598534e+18f)   2014-04-19 18:45:00
我記得 unicode 就是因為 RFC 3629 擋住了才只定到 U+10FFFF唔, 應該反過來說, 因為 UTF-16 surrogate pairs 上限在那裡才有 RFC 3629 出來把 UTF-8 擋住的..不然 UTF-8 原本是支援全部的 32-bit 編碼空間的 (一直到 6 byte 長的編碼)
作者: buganini (霸格尼尼)   2014-04-19 18:49:00
無限期支持淘汰UTF-16!!!是個不上不下的東西啊…
作者: Bencrie   2014-04-19 19:21:00
QString 真的蠻好用的 XD
作者: donkeychen (Bad_To_The_Bone)   2014-04-21 11:37:00
支持反對UTF-16 +1+1......之前在弄sqlite3時也有用過QString因為 SQLite Database Browser 的source code就放Qt的

Links booklink

Contact Us: admin [ a t ] ucptt.com