iconv
là chức năng POSIX có thể xử lý bước mã hóa trung gian. Bạn có thể sử dụng iconv_open
để chỉ định rằng bạn có đầu vào UTF-8 và bạn muốn đầu ra UTF-16. Sau đó, sử dụng tay cầm trả lại từ iconv_open
, bạn có thể sử dụng iconv
(chỉ định bộ đệm đầu vào và bộ đệm đầu ra). Khi bạn làm xong, bạn phải gọi iconv_close
trên tay cầm trở về từ iconv_open
đến tài nguyên miễn phí vv
Bạn sẽ phải kiểm tra nội dung tài liệu của hệ thống của bạn về những gì mã hóa được hỗ trợ bởi iconv
và sơ đồ đặt tên của họ (tức là để cung cấp iconv_open
). Ví dụ, iconv
trên một số hệ thống mong đợi "utf-8"
và những người khác nó có thể mong đợi "UTF8"
, vv
Windows không cung cấp một phiên bản của iconv, và thay vào đó cung cấp đó là chức năng định dạng UTF riêng: MultiByteToWideChar và WideCharToMultiByte.
//UTF8 to UTF16
std::string input = ...
int utf16len = MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(),
NULL, 0);
std::wstring output(utf16len);
MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(),
&output[0], output.size());
//UTF16 to UTF8
std::wstring input = ...
int utf8len = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(),
NULL, 0, NULL, NULL);
std::string output(utf8len);
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(),
&output[0], output.size(), NULL, NULL);
Vì vậy, tôi có thể nói rằng việc sử dụng wchar_t cho UTF-16 trong nền tảng Windows chỉ là vấn đề để thuận tiện, bạn hoàn toàn có thể sử dụng char cho UTF-16 theo lý thuyết? – Hunter
@Hunter: Về lý thuyết có, nhưng trong Windows, 'wchar_t' được sử dụng cho UTF-16 và' char' cho ASCII và UTF-8. –
Trên Windows, 'wchar_t' có kích thước đã biết là 16 bit –