2011-09-26 28 views
15

Chuẩn C++ 11 mới đề cập đến tiêu đề <cuchar>, có lẽ là tương tự với số <uchar.h> của C99. Bây giờ, chúng ta biết rằng C++ 11 mang đến new character types and literals được thiết kế đặc biệt cho UTF16 và UTF32, nhưng tôi không nghĩ ngôn ngữ đó sẽ chứa các hàm để chuyển đổi mã hóa đa byte hẹp (phụ thuộc vào hệ thống) thành một trong mã hóa Unicode. Tuy nhiên, tôi vừa xem qua bản tóm tắt đầu trang cho <cuchar> đề cập đến các hàm mbrtoc16/c16rtombrmbrtoc32/c32rtombr dường như làm điều đó.`<cuchar>` cung cấp gì và tài liệu được ghi ở đâu?

Thật không may, tiêu chuẩn không nói gì về các chức năng đó ngoài tóm tắt đầu trang. Các chức năng đó được xác định ở đâu, chúng thực sự làm gì và tôi có thể đọc thêm về chúng ở đâu? Điều này có nghĩa là người ta có thể sử dụng đúng Unicode hoàn toàn với chuẩn C++ ngay bây giờ, mà không cần thêm bất kỳ thư viện nào?

+0

Trong tiêu chuẩn C? –

+0

@ R.MartinhoFernandes: Tôi không có điều đó - bạn có bất kỳ chi tiết nào không? Ngay cả chỉ tham khảo web? –

+0

oops, tôi dường như không thể tìm thấy những người trong dự thảo C99 mới nhất (N1124). Trong thực tế, tôi thậm chí không thể tìm thấy bất kỳ đề cập đến 'uchar.h'. –

Trả lời

5

Chúng được mô tả trong một số WG21 paper from 2005 nhưng mô tả không có trong tiêu chuẩn cuối cùng. Chúng được ghi thành ISO/IEC 19769: 2004 (Phần mở rộng cho ngôn ngữ lập trình C để hỗ trợ các kiểu dữ liệu ký tự mới) (draft), trong đó tiêu chuẩn C++ 11 đề cập đến.

Văn bản quá dài để gửi ở đây, nhưng đây là những chữ ký:

size_t mbrtoc16(char16_t * pc16, const char * s, size_t n, mbstate_t * ps); 
size_t c16rtomb(char * s, char16_t c16, mbstate _t * ps); 
size_t mbrtoc32(char32_t * pc32, const char * s, size_t n, mbstate_t * ps); 
size_t c32rtomb(char * s, char32_t c32, mbstate_t * ps); 

Các chức năng chuyển đổi giữa các nhân vật multibyte và UTF-16 hay UTF-32 ký tự, tương ứng, tương tự như mbrtowc. Không có phiên bản không reentrant, và trung thực, những người cần chúng?

+0

Bạn có nó trong FDIS (bảng 79)? –

+0

@KerrekSB FDIS chỉ bao gồm bảng có tên. Chỉnh sửa: Tìm thấy chúng! –

+0

Cảm ơn bạn đã cập nhật - mọi tài liệu về những gì họ phải làm và cách chúng được vận hành? Nó chính xác như 'mbsrtowcs'? (Thú vị bằng cách chỉ có phiên bản reentrant.) * Chỉnh sửa: * Oh, không, chờ đã, nó giống như 'mbrtowc'. Không phải chuỗi, chỉ là các ký tự đơn. –

1

Có lẽ tài liệu tốt nhất mà tôi biết là trong n1326, đề xuất thêm TR19769 vào thư viện chuẩn C [Chỉnh sửa: mặc dù nhìn vào nó, N1010 mà R. Martinho Fernandes trích dẫn dường như có khá nhiều tương tự].

+0

Cảm ơn ... mặc dù bây giờ tôi cảm thấy như tôi hiểu * ít hơn *. Những macro này là gì? Chúng có ảnh hưởng đến cách trình biên dịch dịch mã hóa không? Hmmmm .... –

+0

@ R.MartinhoFernandes: Không theo tài liệu được liên kết. Nó nói rằng ** if ** các macro được xác định, sau đó 'char32_t' được mã hóa UTF32; * nếu không * mã hóa được xác định thực hiện. Điều đó có nghĩa rằng nếu tôi thiết lập vĩ mô, trình biên dịch phải sản xuất UTF32, nhưng nếu không nó không? –

+2

@KerrekSB Có vẻ như chuẩn C++ 11 yêu cầu ký tự chuỗi ký tự và chuỗi ký tự 'char16_t' và' char32_t' là UTF-16 và UTF-32, vì vậy trong C++ các macro nên được định nghĩa, tôi đoán vậy. –

Các vấn đề liên quan