2012-01-12 30 views
18

Có thể sử dụng chức năng ANSI của Windows API với chuỗi UTF-8 không?Chức năng ANSI của Windows API và UTF-8

Ví dụ: giả sử tôi có đường dẫn được mã hóa bằng UTF-8. Tôi có thể gọi CreateDirectoryA hoặc CreateFileA và sử dụng đường dẫn UTF-8 hay tôi phải thực hiện một số chuyển đổi trước khi gọi các chức năng?

+2

Yikes. Tại sao bất cứ ai muốn điều đó? Tôi nghĩ rằng chúng tôi đang quá khứ Windows ME bây giờ (đó là phiên bản Windows cuối cùng bao giờ cần các API ANSI). Họ nên chết, đặc biệt là cho các ứng dụng mới được phát triển. – Joey

+1

Từ đâu bạn nhận được chuỗi UTF-8? Việc chuyển đổi ứng dụng của bạn trở nên hoàn toàn dễ dàng hơn với các chuỗi UTF-16, vì các hàm Windows API phiên bản rộng được yêu cầu. Và như Joey nói, * luôn luôn * gọi các phiên bản rộng (với hậu tố 'W'), không phải là phiên bản ANSI. Những người đã lỗi thời trong nhiều thập kỷ. –

+4

@Jey: Bởi vì rất nhiều thư viện C (++) (bao gồm thư viện chuẩn!) Thích làm việc với các chuỗi dựa trên 'char' hơn là chuỗi dựa trên' wchar_t'. Nếu Windows hỗ trợ đầy đủ UTF-8, thì bạn chỉ có thể sử dụng UTF-8 trong suốt chương trình của bạn thay vì phải chuyển đổi giữa UTF-8 và UTF-16 mọi lúc. – dan04

Trả lời

15

No. Sử dụng MultiByteToWideChar để chuyển đổi UTF-8 sang UTF-16 và sau đó gọi các API ký tự rộng như CreateDirectoryW hoặc CreateFileW.

+0

Chết tiệt, tôi sợ điều đó .. :(Gah .. Tốt hơn nên bắt đầu vào lúc đó .. – krebstar

+12

Tôi cũng sẽ thêm rằng vì Windows chỉ sử dụng UTF-16, có thể tốt nhất là bạn nên theo dõi và làm việc với UTF -16 cho hầu hết các phần, và chỉ thực hiện chuyển đổi sang UTF-8 khi bạn cần đọc/ghi từ các nguồn bên ngoài – casablanca

+4

@casablanca: Một cách tiếp cận khác được ủng hộ là sử dụng UTF-8 cho hầu hết các phần và chuyển đổi thành từ UTF-16 chỉ khi nói chuyện với giao diện Windows. –

3

Một cách tiếp cận dễ dàng hơn (hơn sử dụng API Win32 nguyên MultiByteToWideChar) sẽ sử dụng ATL conversion helpers, như CA2CW. Bạn có thể chỉ định CP_UTF8 như trang mã (tham số thứ hai trong các nhà xây dựng), để chuyển đổi từ Unicode UTF-8 Unicode UTF-16:

CreateDirectoryW( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 

Lưu ý rằng trong Unicode xây dựng (mà phải là những người mặc những ngày), CreateDirectory chỉ mở rộng đến CreateDirectoryW, vì vậy tôi sẽ chỉ thả kết thúc "W" và sử dụng (IMHO, dễ đọc hơn) CreateDirectory:

CreateDirectory( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 
Các vấn đề liên quan