2012-05-03 35 views
5

Nếu tôi muốn chuyển đổi một đoạn chuỗi thành UTF-16, giả sử char * xmlbuffer, tôi có phải chuyển loại thành wchar_t * trước khi mã hóa thành UTF-16 không? Và là loại char* được yêu cầu trước khi mã hóa thành UTF-8?wchar_t và mã hóa

Làm thế nào là wchar_t, char liên quan đến UTF-8 hoặc UTF-16 hoặc UTF-32 hoặc định dạng chuyển đổi khác?

Cảm ơn bạn đã trợ giúp!

Trả lời

4

Không, bạn không phải thay đổi loại dữ liệu.

Về wchar_t: tiêu chuẩn nói rằng

Loại wchar_t là một loại riêng biệt có giá trị có thể biểu diễn riêng biệt mã cho tất cả các thành viên của bộ ký tự mở rộng lớn nhất định một trong những miền địa phương được hỗ trợ.

Thật không may, nó không nói mã hóa nào wchar_t được cho là có; điều này phụ thuộc vào việc triển khai thực hiện. Vì vậy, ví dụ: được cho

auto s = L"foo"; 

bạn hoàn toàn không thể giả định giá trị của biểu thức *s là gì.

Tuy nhiên, bạn có thể sử dụng std::string làm một chuỗi các byte biểu thị văn bản ở bất kỳ định dạng chuyển đổi nào mà bạn chọn mà không gặp sự cố. Chỉ cần không thực hiện các hoạt động liên quan đến chuỗi thư viện chuẩn trên đó.

+0

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

+0

@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. –

+0

Trên Windows, 'wchar_t' có kích thước đã biết là 16 bit –

1

Kích thước wchar_t phụ thuộc vào trình biên dịch, do đó mối quan hệ của nó với các định dạng unicode khác nhau sẽ khác nhau.

4

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: MultiByteToWideCharWideCharToMultiByte.

//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); 
+0

Hunter: lưu ý rằng Windows không có biểu tượng, nhưng có nhiều cách để có được nó. @ Dreamlax: Bạn có phiền không nếu chúng tôi đưa câu trả lời của tôi vào câu trả lời của bạn dưới dạng một lựa chọn thay thế cho Windows và loại bỏ tôi? Khái niệm về việc sử dụng một thư viện là một trong những quyền, và của bạn là rõ ràng hơn về điều đó. –

+0

@MooingDuck: Đúng vậy, nghe như một ý tưởng hay. Đặt của tôi trong của bạn hoặc của bạn trong tôi, nào. – dreamlax

+1

@MooingDuck: Hmmm ... không phát ra âm thanh khi tôi nói vậy ... – dreamlax