2012-03-15 42 views
7

Tôi có một số câu hỏi trong việc cố gắng hiểu các mã hóa khác nhau.Câu hỏi mã hóa C/C++

Mã hóa mặc định cho chuỗi là gì?

char ascii[]= "Some text"; // This is plain ASCII right? 
wchar_t utf[] = L"Some Text"; // Is this UTF-16? Or ASCII stored in wchar_t's? 
MessageBoxW(NULL, L"Hello", L"HI", MB_OK); // What encodings are the 2 strings in? 

Sau đó, làm cách nào để tạo chuỗi UTF-8? Nếu tôi muốn hiển thị các ký tự UTF-8 trong một MessageBox?

Câu hỏi của tôi chủ yếu hướng vào Windows bằng cách này, nhưng nếu khác với các hệ điều hành khác nhau mà tôi quan tâm.

Trả lời

9

Tiêu chuẩn không chỉ định mã hóa cho các chuỗi hẹp hoặc rộng. Nhà cung cấp thường sẽ nhắm vào một thứ không đáng ngạc nhiên trên máy tính mục tiêu, nhưng thật khó để nói nhiều hơn thế. Điều này có nghĩa, ví dụ, chuỗi hẹp có lẽ sẽ sử dụng ASCII (hoặc, thực sự, một cái gì đó giống như ISO-8859) trên hầu hết các máy tính cá nhân, nhưng EBCDIC trên một máy tính lớn của IBM.

Các chuỗi ký tự rộng cũng khác nhau - ví dụ, hầu hết các trình biên dịch trên Windows sẽ sử dụng UTF-16. Trên Linux, UTF-32/UCS-4 có lẽ là phổ biến hơn.

Đề cập đến MessageBox đề xuất Windows, trong đó (như bạn đã phỏng đoán), bạn thường sẽ có UTF-16 cho chuỗi rộng. Trong trường hợp này, nếu bạn chỉ định rõ ràng các chuỗi rộng, bạn cũng muốn chỉ định rõ phiên bản rộng của hàm - MessageBoxW.

Theo như tạo ra một chuỗi UTF-8 đi, về tất cả những gì tôi có thể nói là "chúc may mắn". Nó sẽ được lên đến Visual Studio để làm điều đó, nhưng nếu có một cách để làm cho nó để làm điều đó, tôi không nhận thức được nó.

+2

C++ x11 thêm tiền tố 'u8' cho chuỗi ký tự UTF-8, ví dụ:' u8 "Hello World" ', tuy nhiên cho đến khi C++ x11 được chấp nhận bởi nhà cung cấp trình biên dịch C++, bạn sẽ chỉ phải mã hóa UTF -8 chuỗi bằng tay thay thế. Ví dụ, tại thời gian chạy bằng cách sử dụng 'WideCharToMultiByte()' với mã hoá 65001, hoặc tại thời gian biên dịch bằng cách sử dụng một 'char []' chữ có chứa các giá trị octet UTF-8. –