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

看板C_and_CPP作者 (「雄辯是銀,沉默是金」)時間11年前發表 (2014/04/19 07:09), 11年前編輯推噓6(6031)
留言37則, 6人參與, 最新討論串2/2 (看更多)
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正確讀入呢@@? : 之後要能夠支援依照標點符號切割成子字串.. : 請高手指點! : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.114.137.79 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1397891361.A.DB6.html

04/19 16:00, , 1F
其實 QString 本身 dependecies 應該沒有很多(不考慮
04/19 16:00, 1F

04/19 16:01, , 2F
locale 和 regex 之類有的沒的東西的話), 說不定可以抽
04/19 16:01, 2F

04/19 16:01, , 3F
出來, 等有空來研究看看好了
04/19 16:01, 3F

04/19 16:02, , 4F
說真的 QString 應該是我看過最好的 C 相關 Unicode 實作
04/19 16:02, 4F

04/19 17:30, , 5F
UTF-8並沒有多複雜啊? 如果只是要正確斷字,很簡單就
04/19 17:30, 5F

04/19 17:32, , 6F
可以辦到了,libchewing裡面有個http://0rz.tw/gNZJo
04/19 17:32, 6F

04/19 17:34, , 7F
如果是normalize/locale那塊,那大概也是call ICU
04/19 17:34, 7F

04/19 17:35, , 8F
不是做在QT裡面
04/19 17:35, 8F

04/19 17:46, , 9F
有 qstring, 我才不想去用 icu, std::string 要是也能
04/19 17:46, 9F

04/19 17:47, , 10F
有 qstring 的能力, 那就太棒了
04/19 17:47, 10F
※ 編輯: descent (58.114.144.217), 04/19/2014 17:49:12

04/19 17:49, , 11F
目測應該是永遠不會有吧,std::string是char based
04/19 17:49, 11F

04/19 17:52, , 12F
std::string 根本只是 char array 的包裝而已, 別肖想了
04/19 17:52, 12F

04/19 17:53, , 13F
正確作法應該是extend std::string加上UTF-8 specific
04/19 17:53, 13F

04/19 17:53, , 14F
的function
04/19 17:53, 14F

04/19 17:54, , 15F
如果要有真正的 string abstraction 目標當然就不是 UTF8
04/19 17:54, 15F

04/19 17:54, , 16F
不過這樣效率也不好,真要處理字串還是解成wchar吧
04/19 17:54, 16F

04/19 17:55, , 17F
而已, 很多編碼都有一些 quicks 要處理
04/19 17:55, 17F

04/19 17:56, , 18F
寬字元也不是萬用解, 不要忘記 surrogatepairs 啊...
04/19 17:56, 18F

04/19 17:58, , 19F
ㄟ 這就尷尬了 wchar有16bits也有32bits orz
04/19 17:58, 19F

04/19 17:59, , 20F
32bits的話就算萬用了吧
04/19 17:59, 20F

04/19 18:04, , 21F
32-bit 應該是夠用很長一段時間沒錯啦XD
04/19 18:04, 21F

04/19 18:05, , 22F
目前有RFC 3629把上限擋在U+10FFFF應該夠用完這輩子了(?)
04/19 18:05, 22F

04/19 18:08, , 23F
不對 他只擋了UTF-8的上限,沒有說unicode不能超過
04/19 18:08, 23F

04/19 18:08, , 24F
雖然目前還沒超過,範圍內的空間也還綽綽有餘就是了
04/19 18:08, 24F

04/19 18:13, , 25F
不過應該這輩子夠用了, 之後反正肯定不是我維護沒差(欸
04/19 18:13, 25F

04/19 18:17, , 26F
兩位大大對編碼真熟悉
04/19 18:17, 26F

04/19 18:21, , 27F
補充一下,U+10FFFF也是UTF-16 surrogate pairs的上限
04/19 18:21, 27F

04/19 18:45, , 28F
我記得 unicode 就是因為 RFC 3629 擋住了才只定到 U+10FFFF
04/19 18:45, 28F

04/19 18:47, , 29F
唔, 應該反過來說, 因為 UTF-16 surrogate pairs 上限在那裡
04/19 18:47, 29F

04/19 18:47, , 30F
才有 RFC 3629 出來把 UTF-8 擋住的..不然 UTF-8 原本是支援
04/19 18:47, 30F

04/19 18:48, , 31F
全部的 32-bit 編碼空間的 (一直到 6 byte 長的編碼)
04/19 18:48, 31F

04/19 18:49, , 32F
無限期支持淘汰UTF-16!!!
04/19 18:49, 32F

04/19 18:49, , 33F
是個不上不下的東西啊…
04/19 18:49, 33F

04/19 19:21, , 34F
QString 真的蠻好用的 XD
04/19 19:21, 34F

04/21 11:37, , 35F
支持反對UTF-16 +1+1......
04/21 11:37, 35F

04/21 11:41, , 36F
之前在弄sqlite3時也有用過QString
04/21 11:41, 36F

04/21 11:42, , 37F
因為 SQLite Database Browser 的source code就放Qt的
04/21 11:42, 37F
文章代碼(AID): #1JKY4Xss (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
5
18
完整討論串 (本文為第 2 之 2 篇):
問題
5
18
文章代碼(AID): #1JKY4Xss (C_and_CPP)