2012-12-15 45 views
6

Hiện tại tôi đang viết một plugin chỉ là một trình bao bọc xung quanh một thư viện hiện có. Máy chủ lưu trữ của plugin chuyển cho tôi một chuỗi được định dạng utf-16 được định nghĩa như sauLàm thế nào để chuyển đổi mảng utf16 ushort thành chuỗi utf8 std ::?

typedef unsigned short PA_Unichar;

Và thư viện quấn chỉ chấp nhận một char * const hoặc một std :: string utf-8 định dạng chuỗi Tôi cố gắng viết một chức năng chuyển đổi như

std::string toUtf8(const PA_Unichar* data) 
{ 
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert; 
return std::string(convert.to_bytes(static_cast<const char16_t*>(data)); 
} 

Nhưng rõ ràng điều này không làm việc, ném cho tôi một lỗi biên dịch "static_cast từ 'const pointer' (aka 'const unsigned short *') thành 'const char16_t *' không được phép"

Vậy cách thanh lịch/chính xác nhất để làm điều đó là gì?

Cảm ơn bạn trước.

+0

Giá trị của 'std :: is_same :: value' trên nền tảng của bạn là gì? Ngoài ra, trình biên dịch nào? – moshbear

+0

'std :: is_same :: value' có giá trị 0 (false) và tôi đang biên soạn trên Mac với trình biên dịch LLVM của Apple 4.1 mặc dù tôi cũng đã biên dịch nó với Visual Studio 2012 – Robotex

+1

Theo http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2018.html, 'char16_t' là' uint16_least_t', không phải 'uint16_t'. Trên nền tảng của bạn, có vẻ như 'uint16_least_t' là * not * aliased thành' unsigned short', do đó 'sizeof (char16_t)! = Sizeof (unsigned short)'. 'static_cast' sẽ thất bại trên các kiểu con trỏ khi' sizeof's cơ bản không khớp. – moshbear

Trả lời

2

Bạn có thể chuyển đổi các chuỗi PA_unichar thành một chuỗi của char16_t sử dụng constructor basic_string(Iterator, Iterator), sau đó sử dụng std::codecvt_utf8_utf16 khía cạnh như bạn cố gắng:

std::string conv(const PA_unichar* str, size_t len) 
{ 
    std::u16string s(str, str+len); 
    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert; 
    return convert.to_bytes(s); 
} 

tôi nghĩ đúng vậy. Rất tiếc, tôi không thể kiểm tra điều này vì triển khai của tôi chưa hỗ trợ. Tôi có một triển khai thực hiện wstring_convert mà tôi dự định đưa vào GCC 4.9, nhưng tôi không triển khai codecvt_utf8_utf16 để thử nghiệm.

+0

Cảm ơn bạn rất nhiều, nó có vẻ hoạt động tốt và điều này cũng đã cứu tôi từ một số loại phôi khủng khiếp :) – Robotex

+0

Tuyệt vời, tôi vui mừng trình biên dịch trong đầu của tôi có quyền kiểm tra loại! Không quan tâm, bạn đang sử dụng trình biên dịch nào hỗ trợ các lớp đó? –

+0

Tôi đang biên dịch với trình biên dịch LLVM 4.1 trên các hệ thống dựa trên Mac (sau khi thiết lập cờ '-std = C++ 11') và Visual Studio 2012 trên các hệ thống cửa sổ – Robotex

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