c#字符串到c++;wstring使用Encoding.Unicode.Getbytes()

c#字符串到c++;wstring使用Encoding.Unicode.Getbytes(),c#,c++,unicode,encoding,utf-16,C#,C++,Unicode,Encoding,Utf 16,所以问题是,当使用c#时,字符是4个字节,所以“abc”是(65 0 66 0 67 0) 在将C++输入到WSCORE中时,将其发送到一个套接字中,得到以下输出A/P> 我如何能够将这样的字符串转换成C++字符串?听起来好像需要ASCII或UTF-8编码而不是Unicode。 < 65 > 0 66 0 67 0 只会得到< < /> >,因为下一个零被解释为C++中的空终止字符。< /P> 可以找到将Unicode转换为ASCII的策略 使用c#字符是4个字节 否,在CSharp中,字符

所以问题是,当使用c#时,字符是4个字节,所以“abc”是(65 0 66 0 67 0)

在将C++输入到WSCORE中时,将其发送到一个套接字中,得到以下输出A/P>


<>我如何能够将这样的字符串转换成C++字符串?

听起来好像需要ASCII或UTF-8编码而不是Unicode。

< 65 > 0 66 0 67 0 只会得到< <代码> < /> >,因为下一个零被解释为C++中的空终止字符。< /P> 可以找到将Unicode转换为ASCII的策略

使用c#字符是4个字节

否,在CSharp中,字符串以UTF16编码。UTF16中的代码单元至少需要两个字节。对于简单字符,单个代码单元可以表示一个代码点(例如65 0)

在Windows wstring上,通常也是UTF16(2-4字节)编码的。但是在Unix/Linux上,wstring通常使用UTF32编码(总是4字节)

与ASCII相比,Unicode代码点具有相同的数值-因此UTF-16编码的ASCII文本通常如下所示:{num}0{num}0{num}0。。。 请参见此处的详细信息:()

你能给我们看一些代码,你是如何构造你的wstring对象的吗?
空字节在这里很关键,因为它是ASCII/ANSI字符串的结束标记。

我已经能够通过使用std::u16string解决这个问题。 下面是一些示例代码

std::vector<char> data = { 65, 0, 66, 0, 67, 0 };
std::u16string string(&data[0], data.size() / 2);
// now string should be encoded right
std::vector data={65,0,66,0,67,0};
std::u16string(&data[0],data.size()/2);
//现在字符串应该正确编码了

<代码> >我得到以下输出A.<代码>,因为您尝试了字节作为 STD:String ,它仅适用于单字节代码页,或者由于C++中缺乏标准化,UTF8。这将第一个空字节解释为字符串的结尾。你应该使用<代码> STD::U16Stords/Cuff>读取UTF16字节。BTW。你没有张贴C或C++代码,但是bug表明你试图一次一个地从C++读取字符串。为此,您需要通过发出适当的NUL从C#端终止字符串:UTF8为一个
0x00
字节,UTF16为两个
0x00
。字符为4个字节:否,两个字节ASCII或UTF-8或一个单字节编码。但是,问题是说
wstring
。在C++方面,可以是UTF8编码,也可以是
u16string
。7位US-ASCII编码将损坏任何非英语文本。UTF8将发出与英语文本US-ASCII相同的字节您好,我需要减少丢失,并且当您将其转换为ASCII时,无法恢复数据。对我来说,听起来像二进制数据,而不是字符串。我只是从套接字向其传递原始数据,如so
std::vector data=socket.read()然后
std::wcout好吧,那么我认为“套接字”停止读取空字节。如果您使用以下代码:。字符串构造似乎有效(这对我来说有点奇怪)。没有套接字是我编写的自定义函数。我在断点处查看了变量,数据在那里,它只是在\0结束字符串,因此向量中有6个字节。。。要处理utf16,您应该执行如下操作:auto strView=std::u16string_view(reinterpret_cast(&data[0]),data.size());