Câu hỏi nhanh về hỗ trợ UTF-8 và nhiều API Win32 khác nhau.Hỗ trợ WinAPI và UTF-8
Trong một dự án C++ MFC điển hình, có thể cho MessageBox() hiển thị chuỗi được mã hóa UTF-8 không?
Cảm ơn, Andrew
Câu hỏi nhanh về hỗ trợ UTF-8 và nhiều API Win32 khác nhau.Hỗ trợ WinAPI và UTF-8
Trong một dự án C++ MFC điển hình, có thể cho MessageBox() hiển thị chuỗi được mã hóa UTF-8 không?
Cảm ơn, Andrew
câu trả lời nhanh: Số
Còn câu trả lời: Nó sẽ hoạt động nếu chuỗi chỉ chứa các ký tự ANSI thường xuyên, ví dụ như tiếng Anh-Mỹ, kể từ khi các mã nhân vật đều giống nhau trong UTF -8 và ANSI.
Nếu các ký tự không phải ANSI được bao gồm hoặc bất kỳ ký tự mã hóa hai byte nào, bạn sẽ cần phải chuyển đổi thành Unicode-16 bằng MultiByteToWideChar với CP_UTF8. Chương trình của bạn cũng sẽ cần được biên dịch với UNICODE được xác định hoặc bạn có thể sử dụng các cuộc gọi API 'W' - ví dụ: MessageBoxW.
(Lưu ý rằng các hàm lấy đối số văn bản như MessageBox, bản đồ CreateWindow cho các phiên bản 'A' hoặc 'W' tùy thuộc vào việc UNICODE được xác định).
Điều này cũng có thể được sử dụng;
Nope, sử dụng MultiByteToWideChar với CP_UTF8
. Xem http://www.siao2.com/2006/10/11/816996.aspx vì sao A không thể làm được; W (UCS-2) là giải pháp thay thế duy nhất.
Tôi sử dụng macro chuyển đổi chuỗi ATL/MFC. Ví dụ, nếu bạn có một chuỗi ASCII gọi myUTF8Str
chứa ký tự UTF8:
::MessageBox(hWnd, CA2T(myUTF8Str, CP_UTF8), _T("Caption"), MB_OK);
Hoặc bạn có thể tạo ra một thể hiện của chuỗi, ví dụ:
CA2T myConvertedString(myUTF8Str, CP_UTF8);
...
TRACE(_T("Converted: %s\n"), myUTF8Str.m_psz);
Lưu ý m_psz
thành viên cho phép read-only truy cập vào con trỏ chuỗi thô.
Bạn cũng có thể mã hóa sử dụng CT2A
, ví dụ:
CT2A myEncodedString("Some UTF8", CP_UTF8);
Nếu bạn không sử dụng macro TEXT, sau đó sử dụng CA2W, CW2A vv
Chỉ cần một chút về thuật ngữ, nhưng nó được gọi là UTF -16. Không có thứ gì như Unicde-16. :) – jalf
Bài viết này của Joel khá cũ và anh ấy thực sự làm giảm giá trị UTF-8, đó là mã hóa Unicode kỹ thuật thuận tiện nhất. Ý tưởng của riêng mình về việc tìm kiếm thẻ meta HTML chỉ hoạt động với mã hóa UTF-8 hoặc một số byte đơn (mã ASCII có nguồn gốc). Nếu không, bạn nhận được không có giá trị byte trên tất cả các nơi mà làm cho nó khó khăn để tìm ký tự '<'. Trong UTF-8 bạn có thể phân tích cú pháp XML (và HTML) mà không phải lo lắng về Unicode vì nó đảm bảo bạn sẽ thấy các byte <127 chỉ khi chúng mã hóa các ký tự ASCII thực tế. – jpc
Cũng lưu ý rằng phần lớn WinAPI thực sự giống như UCS-2, chứ không phải là UTF-16, trong đó ít nhất một số phần của WinAPI (mà? Tôi không có ý tưởng - tất cả dường như được đánh trúng và bỏ lỡ) thắng ' xử lý các cặp thay thế một cách chính xác; nói cách khác, họ sẽ giả định rằng UTF-16 là một mã hóa có chiều rộng cố định. –