C++;wstring如何从以NULL结尾的wchar\t数组进行赋值 C++标准库中的大多数文本将WString称为等效的字符串,除了在WCHARGT T上而不是字符上进行参数化,然后继续仅演示字符串。

C++;wstring如何从以NULL结尾的wchar\t数组进行赋值 C++标准库中的大多数文本将WString称为等效的字符串,除了在WCHARGT T上而不是字符上进行参数化,然后继续仅演示字符串。,c++,unicode,wstring,C++,Unicode,Wstring,有时候,有一些特殊的怪癖,这里有一个:我似乎无法从一个以空结尾的16位字符数组中分配wstring。问题是赋值愉快地使用空字符和任何垃圾作为实际字符。以下是一个非常小的降价: typedef unsigned short PA_Unichar; PA_Unichar arr[256]; fill(arr); // sets to 52 00 4b 00 44 00 61 00 74 00 61 00 00 00 7a 00 7a 00 7a 00 // now arr contains "RKD

有时候,有一些特殊的怪癖,这里有一个:我似乎无法从一个以空结尾的16位字符数组中分配wstring。问题是赋值愉快地使用空字符和任何垃圾作为实际字符。以下是一个非常小的降价:

typedef unsigned short PA_Unichar;
PA_Unichar arr[256];
fill(arr); // sets to 52 00 4b 00 44 00 61 00 74 00 61 00 00 00 7a 00 7a 00 7a 00
// now arr contains "RKData\0zzz" in its 10 first values
wstring ws;
ws.assign((const wchar_t *)arr);
int l = ws.length();
此时,l不是预期的6(RKData中的字符数),而是更大。在我的试运行中,它是29。为什么是29岁?不知道。内存转储不会显示第29个字符的任何特定值

问题:这是我标准C++库(Mac OS X雪豹)中的bug,还是代码中的bug? 我应该如何将一个由16位字符组成的空终止数组分配给wstring

谢谢

在大多数Unix(以及Mac OS X)下,
whar\u t
表示UTF-32单代码点,而不是像windows那样的16位UTF-16点

因此,您需要:

  • 要么:

    ws.assing(arr,arr + length_of_string);
    
    这将使用arr作为迭代器,并将每个短int复制到wchar\u t。 但是,只有当角色位于BMP中或代表UCS-2时,这才有效 (16位传统编码)

  • 或者,正确使用utf-16:将utf-16转换为utf-32——您需要找到代理项对并将它们合并到单个代码点


  • 我认为你的代码可以工作,只要检查一下。但你可以随时解决问题:

    ws.assign(static_cast<const wchar_t*>(arr), wcslen(arr));
    
    ws.assign(静态广播(arr)、wcslen(arr));
    
    就这么做吧。您没有在代码中添加代码,您将一个未签名的短字符串数组分配给wstring,并使用强制转换关闭编译器。wchar_t!=未签名短。您当然不能假设它们的大小相同。

    只是在黑暗中拍摄,请尝试双空terminator@obelix,一个空字符是相同的大尾端和小尾端。@Nick-yes。我看到了二进制,并认为它可能是endianness。如果ws.assign不能通过挑选空字符找到字符串的正确终止点,为什么wcslen会这样做?我想Artyom一针见血了——哇未签名短。