【问题标题】:c# string to c++ wstring using Encoding.Unicode.Getbytes()c# 字符串到 c++ wstring 使用 Encoding.Unicode.Getbytes()
【发布时间】:2021-03-06 09:19:23
【问题描述】:

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

当通过在套接字中发送将其输入到 c++ 中的 wstring 时,我得到以下输出 a.

如何将这样的字符串转换为 c++ 字符串?

【问题讨论】:

  • i get the following output a. 这是因为您尝试将字节作为std:string,它仅适用于单字节代码页,或者由于 C++ 中缺乏标准化,UTF8。这将第一个空字节解释为字符串的结尾。您应该使用 std::u16string 来读取 UTF16 字节。
  • 顺便说一句,您没有发布您的 C# 或 C++ 代码,但该错误表明您正在尝试从 C++ 一次读取一个字符串。为此,您需要通过发出适当的 NUL 来终止 C# 端的字符串:对于 UTF8 来说是一个 0x00 字节,对于 UTF16 来说是两个 0x00
  • char 是 4 个字节:不,两个字节

标签: c# c++ unicode encoding utf-16


【解决方案1】:

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

65 0 66 0 67 0 只会得到A,因为在 C++ 中下一个零被解释为空终止字符。

将 Unicode 转换为 ASCII 的策略可以在 here 找到。

【讨论】:

  • ASCII 或 UTF-8 或单字节编码之一。但是,问题确实是wstring
  • UTF8 编码,或 C++ 方面的 u16string。 7 位 US-ASCII 编码将破坏任何非英文文本。 UTF8 将发出与英语文本的 US-ASCII 相同的字节
  • 您好,我需要减少丢失,当您将其转换为 ASCII 时,无法恢复数据。
  • 对我来说听起来像是二进制数据,而不是字符串。
【解决方案2】:

使用 c# char 是 4 个字节

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

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

Unicode 代码点与 ASCII 相比具有相同的数值 - 因此 UTF-16 编码的 ASCII 文本通常看起来像这样:{num} 0 {num} 0 {num} 0... 在此处查看详细信息:(https://en.wikipedia.org/wiki/UTF-16)

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

【讨论】:

  • 好吧,我只是将原始数据从套接字传递给它,就像std::vector<char> data = socket.read(); 然后std::wcout << std::wstring(data.begin(), data.end()); 抱歉在这个框中写的语法错误(如果有的话)我也不知道如何打印一个 u16string但我已经在我的文件解析器中尝试过它并没有改变任何东西
  • 好吧,那么我认为“socket”在空字节上停止读取。
  • 如果您使用此代码:godbolt.org/z/Yds7of。字符串结构似乎有效(这对我来说有点令人惊讶)。
  • No socket 是我编写的自定义函数 我在断点时查看了 var 并且数据在那里它只是在 \0 处结束字符串
  • 因此向量中有 6 个字节...要处理 utf16,您应该执行以下操作: auto strView = std::u16string_view( reinterpret_cast(&data[0]), data .size() );
【解决方案3】:

我已经能够通过使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2013-02-24
    • 2016-01-15
    • 1970-01-01
    • 2013-03-19
    • 2012-05-24
    相关资源
    最近更新 更多