Có, mã hóa UTF-8 có thể được sử dụng với char, string và stringstream. Một char sẽ giữ một đơn vị mã UTF-8, trong đó tối đa bốn có thể được yêu cầu để đại diện cho một điểm mã Unicode duy nhất.
Tuy nhiên, có một số vấn đề khi sử dụng UTF-8 đặc biệt với trình biên dịch của Microsoft. Việc triển khai C++ sử dụng 'bộ ký tự thực hiện' cho một số thứ, chẳng hạn như ký tự mã hóa và chuỗi ký tự chuỗi. VC++ luôn sử dụng mã hóa miền địa phương hệ thống làm bộ ký tự thực hiện và Windows không hỗ trợ UTF-8 làm mã hóa miền địa phương hệ thống, do đó UTF-8 không bao giờ được thực hiện bởi bộ ký tự thực thi.
Điều này có nghĩa là VC++ không bao giờ cố tình tạo ra ký tự UTF-8 và chuỗi ký tự chuỗi. Thay vào đó trình biên dịch phải được lừa.
Trình biên dịch sẽ chuyển đổi từ mã hóa mã nguồn đã biết thành mã hóa thực thi. Điều đó có nghĩa là nếu trình biên dịch sử dụng mã hóa miền địa phương cho cả mã hóa nguồn và mã thực thi thì không có chuyển đổi nào được thực hiện.Nếu bạn có thể nhận được dữ liệu UTF-8 vào mã nguồn nhưng có trình biên dịch nghĩ rằng nguồn sử dụng mã hóa miền địa phương, thì ký tự chữ cái và chuỗi ký tự sẽ sử dụng mã hóa UTF-8. VC++ sử dụng cái gọi là 'BOM' để phát hiện mã hóa nguồn và sử dụng mã hóa miền địa phương nếu không phát hiện BOM. Do đó bạn có thể nhận được các chuỗi ký tự chuỗi được mã hóa UTF-8 bằng cách lưu tất cả các tệp nguồn của bạn dưới dạng "UTF-8 không có chữ ký".
Hãy cẩn thận với phương pháp này. Trước tiên, bạn không thể sử dụng UCN với ký tự hẹp và chuỗi ký tự. Tên nhân vật phổ quát phải được chuyển đổi thành bộ ký tự thực thi, không phải là UTF-8. Bạn phải viết ký tự theo nghĩa đen để nó xuất hiện dưới dạng mã UTF-8 trong mã nguồn hoặc bạn có thể sử dụng dấu thoát hex nơi bạn viết mã UTF-8 theo cách thủ công. Thứ hai, để tạo ra các ký tự rộng và chuỗi ký tự chuỗi, trình biên dịch thực hiện một chuyển đổi tương tự từ mã hóa nguồn thành tập ký tự thực thi rộng (luôn là UTF-16 trong VC++). Vì chúng ta đang nói dối với trình biên dịch về mã hóa, nó sẽ thực hiện chuyển đổi này sang UTF-16 không chính xác. Vì vậy, trong nhân vật rộng và chuỗi ký tự bạn không thể sử dụng các ký tự không phải ascii theo nghĩa đen, và thay vào đó bạn phải sử dụng UCN hoặc thoát hex.
UTF-8 có độ dài thay đổi (như là UTF-16). Các chỉ mục được sử dụng với at()
và substr()
là đơn vị mã thay vì chỉ số điểm ký tự hoặc mã. Vì vậy, nếu bạn muốn có một đơn vị mã cụ thể thì bạn chỉ có thể lập chỉ mục vào chuỗi hoặc mảng hoặc bất kỳ thứ gì như bình thường. Nếu bạn cần một điểm mã cụ thể thì bạn cần một thư viện có thể hiểu việc soạn các đơn vị mã UTF-8 thành các điểm mã (chẳng hạn như Boost Unicode iterators library) hoặc bạn cần chuyển đổi dữ liệu UTF-8 thành UTF-32. Nếu bạn cần các ký tự được người dùng nhận thức thực tế thì bạn cần một thư viện để hiểu cách các điểm mã được tạo thành các ký tự. Tôi tưởng tượng ICU có chức năng như vậy, hoặc bạn có thể thực hiện các Default Grapheme Cluster Boundary Specification từ tiêu chuẩn Unicode.
Việc xem xét trên UTF-8 chỉ thực sự quan trọng đối với cách bạn ghi dữ liệu Unicode trong mã nguồn. Nó có ít mang về đầu vào và đầu ra của chương trình.
Nếu yêu cầu của bạn cho phép bạn chọn cách thực hiện đầu vào và đầu ra thì tôi vẫn khuyên bạn nên sử dụng UTF-8 cho đầu vào. Tùy thuộc vào những gì bạn cần làm với đầu vào, bạn có thể chuyển đổi nó sang mã hóa khác dễ dàng để bạn xử lý hoặc bạn có thể viết các quy trình xử lý của mình để làm việc trực tiếp trên UTF-8.
Nếu bạn muốn sản xuất bất kỳ thứ gì thông qua bảng điều khiển Windows, bạn sẽ muốn có một mô đun được xác định rõ ràng cho đầu ra có thể có các triển khai khác nhau, vì đầu ra quốc tế cho bàn điều khiển Windows sẽ yêu cầu thực hiện khác. trên Windows hoặc giao diện điều khiển và đầu ra tệp trên các nền tảng khác. (Trên các nền tảng khác, giao diện điều khiển chỉ là một tệp khác, nhưng giao diện điều khiển Windows cần xử lý đặc biệt.)
Đối với UTF wchar_t được đề xuất lưu trữ.Bạn có thể lưu trữ UTF-8 trong char mà không có vấn đề nhưng kết quả sẽ là lạ. – perilbrain
@Anonymous phụ thuộc vào nền tảng của bạn (và trên * mà * hương vị của UTF mà bạn quan tâm). Trên Windows, 'wchar_t' phù hợp với UTF-16. Trên Linux, nó phù hợp để sử dụng cho UTF-32. Đối với UTF-8, 'char' là một ứng cử viên khá hợp lý (trừ khi bạn có quyền truy cập vào các kiểu ký tự" mới "trong C++ 11) – jalf
Chương trình này sẽ được chuyển qua các nền tảng. Loại ký tự nào có thể được sử dụng tốt nhất cho mục đích đó? – Qman