2008-10-03 26 views
23

Làm cách nào để đặt trang mã thành UTF-8 trong chương trình C Windows?UTF-8 trong Windows

Tôi có thư viện của bên thứ ba đã sử dụng fopen để mở tệp. Tôi có thể sử dụng wcstombs để chuyển đổi tên tập tin Unicode của tôi sang trang mã hiện tại, tuy nhiên nếu người dùng có tên tệp có ký tự bên ngoài trang mã thì thao tác này sẽ bị hỏng.

Lý tưởng nhất là tôi chỉ cần gọi _setmbcp (65001) để đặt trang mã thành UTF-8, tuy nhiên tài liệu MSDN cho _setmbcp nói rằng UTF-8 không được hỗ trợ.

Làm cách nào để giải quyết vấn đề này?

Trả lời

25

Thật không may, không có cách nào để biến Unicode thành trang mã hiện tại trong Windows. Các hằng số CP_UTF7CP_UTF8 là các mã hóa giả, chỉ được sử dụng trong các hàm chuyển đổi MultiByteToWideCharWideCharToMultiByte, như Ben đã đề cập.

Sự cố của bạn tương tự như vấn đề của lớp C++. Các nhà xây dựng đầu mối chỉ chấp nhận các tên char*, không thể mở tệp có tên Unicode thực. Giải pháp duy nhất được cung cấp bởi VC là một hack: mở tệp một cách riêng biệt và sau đó đặt tay cầm cho đối tượng luồng. Tôi sợ rằng đây không phải là một lựa chọn cho bạn, tất nhiên, vì thư viện của bên thứ ba có lẽ không chấp nhận xử lý.

Giải pháp duy nhất tôi có thể nghĩ là tạo tệp tạm thời bằng tên không phải Unicode, được liên kết cứng với tên gốc và sử dụng làm tham số.

10

Tất cả các API của Windows đều nghĩ trong UTF-16, vì vậy, bạn nên viết một trình bao bọc xung quanh thư viện của mình chuyển đổi ở ranh giới.

Lạ lùng thay, Windows nghĩ UTF-8 là một bảng mã cho các mục đích chuyển đổi, vì vậy bạn sử dụng các API giống như bạn để chuyển đổi giữa codepage:

std::wstring Utf8ToUtf16(const char* u8string) 
{ 
    int wcharcount = strlen(u8string); 
    wchar_t *tempWstr = new wchar_t[wcharcount]; 
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount); 
    wstring w(tempWstr); 
    delete [] tempWstr; 
    return w; 
} 

Và một cái gì đó về hình thức tương tự để chuyển đổi trở lại .

-4

Sử dụng cygwin (cung cấp ngôn ngữ UTF-8 theo mặc định) hoặc viết bản libc của riêng bạn cho Windows thực hiện các bản dịch UTF-8 tới UTF-16 cần thiết và kết thúc các chức năng không theo tiêu chuẩn _wfopen.

+2

thực sự? bạn sẽ gợi ý điều đó? –