2015年4月1日 星期三

c++ 11 的 unicode support



官方網站可以下載書上的 example code。

對於處理 unicode 你有什麼好辦法嗎? 以 c++ 處理 unicode, 我還蠻喜歡 qt 的 qstring, 設計的很好用, 底層是用 icu 在處理 unicode。

c++11 終於有某種程度的支援了, wstring2utf8.h 是範例程式。

wstring2utf8.h
 1 // from: http://www.cppstdlib.com/
 2 /* The following code example is taken from the book
 3  * "The C++ Standard Library - A Tutorial and Reference, 2nd Edition"
 4  * by Nicolai M. Josuttis, Addison-Wesley, 2012
 5  *
 6  * (C) Copyright Nicolai M. Josuttis 2012.
 7  * Permission to copy, use, modify, sell and distribute this software
 8  * is granted provided this copyright notice appears in all copies.
 9  * This software is provided "as is" without express or implied
10  * warranty, and with no claim as to its suitability for any purpose.
11  */
12 #include <codecvt>
13 #include <string>
14 
15 // convert UTF-8 string to wstring
16 std::wstring utf8_to_wstring (const std::string& str)
17 {
18     std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
19     return myconv.from_bytes(str);
20 }
21 
22 // convert wstring to UTF-8 string
23 std::string wstring_to_utf8 (const std::wstring& str)
24 {
25     std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
26     return myconv.to_bytes(str);
27 }

這樣用, 我就可以把一個 utf8 string 轉成 utf-32。

const char *disp_str = "a中文bあい";
std::wstring utf32_str = utf8_to_wstring(disp_str);

不過 gcc 4.9.2 的 c++11 unicode 只支援一半, 我改用了 clang 和 libc++ 才能正常編譯。

clang++-3.4 -std=c++11 -stdlib=libc++ -o wstring2utf8 wstring2utf8.cpp

gcc 要到 5 才會提供 std::codecvt_utf8<wchar_t>, 有點落後了。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。