2011-10-03 23 views
12

C++ 11 giới thiệu một bộ tiền tố chuỗi ký tự mới (và thậm chí cho phép hậu tố do người dùng xác định). Ngày đầu này, bạn có thể trực tiếp sử dụng trình tự thoát Unicode để mã một biểu tượng nhất định mà không cần phải lo lắng về mã hóa.Unicode string literals

const char16_t* s16 = u"\u00DA"; 
const char32_t* s32 = U"\u00DA"; 

Nhưng tôi có thể sử dụng các chuỗi unicode thoát trong wchar_t xâu không? Nó có vẻ là một khiếm khuyết nếu điều này là không thể.

const wchar_t* sw = L"\u00DA"; 

Giá trị số nguyên của sw[0] sẽ tất nhiên phụ thuộc vào những gì wchar_t là trên một nền tảng cụ thể, nhưng với tất cả các hiệu ứng khác, điều này sẽ được cầm tay, không?

+0

Tôi tin rằng giá trị của 'sw [0]' phụ thuộc vào những gì 'wchar_t' là trên một nền tảng đặc biệt chỉ trong phạm vi của kích thước của 'wchar_t' là gì. I E. '\ u00DA' sẽ luôn dẫn đến một số mã hóa Unicode (UTF-8, UTF-16, UTF-32) của U + 00DA, ngay cả khi đó không phải là mã hóa bình thường của nền tảng cho loại đó. – bames53

+1

Thực ra ở trên không chính xác. Việc thực hiện được coi là để xử lý các tên ký tự phổ quát vì nó sẽ là ký tự chữ. Vì vậy, nếu việc thực hiện dịch các ký tự trong một chuỗi ký tự thành bộ ký tự thực thi thì nó cũng nên làm như vậy với UCN. Bạn chỉ được đảm bảo mã hóa UTF nếu UCN ở trong một chữ unicode (ví dụ: u8 "\ u00DA"). – bames53

Trả lời

8

Nó sẽ hoạt động nhưng có thể không có ngữ nghĩa mong muốn. \u00DA sẽ mở rộng thành nhiều ký tự đích khi cần thiết cho mã hóa UTF8/16/32, tùy thuộc vào kích thước wchar_t, nhưng lưu ý rằng các chuỗi rộng không có bất kỳ ngữ nghĩa mã hóa được bảo đảm tài liệu nào - chúng đơn giản là "hệ thống mã hóa ", không cố gắng thực hiện để nói đó là gì hoặc yêu cầu người dùng phải biết đó là gì.

Vì vậy, tốt nhất là không trộn và kết hợp. Sử dụng một trong hai, nhưng không phải cả hai, trong hai:

  1. hệ thống cụ thể: char*/"", wchar_t*/L"", \x -literals, mbstowcs/wcstombs

  2. Unicode: char*/u8"", char16_t*/u"", char32_t*/U"", \u/\U chữ.

(Dưới đây là somerelatedquestions của tôi về đề tài này.)

+0

Để biết chi tiết đầy đủ về nền của câu hỏi này, [thử nghiệm libC++ này] (http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale .ctype.byname/is_1.pass.cpp) không hoạt động trên Windows ở dòng '\ x00DA'. Tôi tự hỏi nếu tôi có thể thay thế điều này với '\ u00DA' và có nó làm việc cho tất cả' wchar_t' là đủ lớn (tức là 16 hoặc 32-bit) – rubenvb