2009-03-07 31 views
8

Tôi thấy rằng C++ 0x sẽ thêm hỗ trợ cho UTF-8, UTF-16 và UTF-32 literals. Nhưng những gì về chuyển đổi giữa ba đại diện?Có hỗ trợ C++ 0x std :: chuyển đổi chuỗi ký tự thành/từ chuỗi byte UTF-8 không?

Tôi định sử dụng std :: wstring ở mọi nơi trong mã của mình. Nhưng tôi cũng cần phải thao tác dữ liệu mã hóa UTF-8 khi xử lý các tệp và mạng. Liệu C++ 0x cũng cung cấp hỗ trợ cho các hoạt động này?

Trả lời

15

Trong C++ 0x, char16_tchar32_t sẽ được sử dụng để lưu trữ UTF-16 và UTF-32 chứ không phải wchar_t.

Từ dự thảo n2798:

22.2.1.4 Lớp mẫu codecvt

2 codecvt lớp là để sử dụng khi chuyển đổi từ một bộ mã khác, chẳng hạn như từ ký tự rộng để multibyte ký tự hoặc giữa các mã hóa ký tự rộng như Unicode và EUC.

3 Các chuyên môn cần thiết trong Bảng 76 (22.1.1.1.1) chuyển đổi việc triển khai- bộ ký tự gốc được xác định. codecvt thực hiện một chuyển đổi thoái hóa; nó không chuyển đổi chút nào. Chuyên môn codecvt<char16_t, char, mbstate_t> chuyển đổi giữa các lược đồ mã hóa UTF-16 và UTF-8, và chuyên môn codecvt <char32_t, char, mbstate_t> chuyển đổi giữa các lược đồ mã hóa UTF-32 và UTF-8. codecvt<wchar_t,char,mbstate_t> chuyển đổi giữa các bộ ký tự gốc cho các ký tự hẹp và rộng. Chuyên môn trên mbstate_t thực hiện chuyển đổi giữa các mã hóa được biết đến với trình triển khai thư viện.

Các mã hóa khác có thể được chuyển đổi bằng cách chuyên về loại trạng thái do người dùng định nghĩa. Đối tượng stateT có thể chứa bất kỳ trạng thái nào hữu ích để giao tiếp với hoặc từ các thành viên do_in hoặc do_out chuyên dụng.

Các điều về wchar_t là nó không cung cấp cho bạn bất kỳ đảm bảo về mã hóa được sử dụng. Nó là một kiểu có thể chứa ký tự nhiều byte. Giai đoạn. Nếu bạn định viết phần mềm bây giờ, bạn phải sống với sự thỏa hiệp này. Trình biên dịch tuân thủ C++ 0x vẫn còn rất xa. Bạn luôn có thể cung cấp cho các trình biên dịch CTP và g ++ VC2010 một thử cho những gì nó có giá trị. Hơn nữa, wchar_t có kích thước khác nhau trên các nền tảng khác nhau mà là một điều cần xem ra cho (2 byte trên VS/Windows, 4 byte trên GCC/Mac và vv). Sau đó có các tùy chọn như -fshort-wchar cho GCC để làm phức tạp thêm vấn đề.

Giải pháp tốt nhất là sử dụng thư viện hiện có. Theo đuổi các lỗi UNICODE xung quanh không phải là cách sử dụng tốt nhất của nỗ lực/thời gian. Tôi muốn đề nghị bạn hãy xem tại địa chỉ:

Thông tin thêm về C++ 0x Unicode xâu GNU libiconv

  • IBM here

  • 0

    Cảm ơn bạn dirkgently. Tôi chưa đăng ký, vì vậy tôi không thể upvote hoặc trả lời trực tiếp như một bình luận.

    Tôi đã học được điều gì đó với codecvt. Tôi biết về các thư viện bạn đề xuất và tài nguyên sau cũng có thể hữu ích http://www.unicode.org/Public/PROGRAMS/CVTUTF/.

    Dự án dành cho thư viện phải là nguồn mở. Tôi muốn giảm thiểu sự phụ thuộc với các thư viện bên ngoài. Tôi đã có một sự phụ thuộc với libgc và boost, mặc dù sau này tôi chỉ sử dụng các luồng. Tôi thực sự muốn dính vào tiêu chuẩn C++ và tôi hơi thất vọng khi GC được hỗ trợ bằng cách nào đó bị loại bỏ.

    Dường như VC++ express 2008 được cho là hỗ trợ hầu hết tiêu chuẩn C++ 0x cũng như icc. Vì tôi hiện đang phát triển với VC++ và nó vẫn sẽ mất một thời gian cho đến khi thư viện được phát hành, tôi muốn thử sử dụng codecvt và chuỗi char32_t.

    Có ai biết cách thực hiện việc này không? Tôi có nên đăng câu hỏi khác không?

    +0

    Một câu hỏi khác có lẽ là điều tốt nhất. – dalle

    +0

    @chmike: Thiếu hỗ trợ lambda trong 08 khiến tôi không nhìn xa hơn nữa. Tuy nhiên, tôi có thể xem xét mức độ tương thích C++ 0x trong VS2008 (tôi có Pro). Không phải là một dự án nguồn mở tốt nhất được hỗ trợ bởi một trình biên dịch mã nguồn mở? Chỉ cần tò mò (ngay cả khi 08 thể hiện edn là miễn phí). Vui lòng hỏi thêm! – dirkgently

    +0

    @dirkgently Tôi đang cố gắng để làm cho các gói làm việc với VC08, g + + và sau đó với icc. Nó buộc tôi phải tuân theo tiêu chuẩn. Nỗ lực này đã giúp tôi tìm ra một số lỗi mà trình biên dịch không phát hiện được. Một số nơi được phát hiện bởi g ++ và những người khác bằng VC08. – chmike

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