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.
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
'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
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