字符串转换:MBCS <-> UNICODE 内有多个 \0

Posted

技术标签:

【中文标题】字符串转换:MBCS <-> UNICODE 内有多个 \\0【英文标题】:String-Conversion: MBCS <-> UNICODE with multiple \0 within字符串转换:MBCS <-> UNICODE 内有多个 \0 【发布时间】:2012-08-23 21:32:00 【问题描述】:

我正在尝试将包含来自位图文件的数据的 std::string 缓冲区转换为 std::wstring。

我正在使用MultiByteToWideChar,但这不起作用,因为函数在遇到第一个'\0' 字符后停止。似乎它将其解释为字符串的结尾。

当我不传递 -1 作为长度参数,而是传递 std::string-Buffer 中数据的实际长度时,它会将 Unicode-String 与在原始位置中明确未出现的字符混淆字符串...

我必须编写自己的转换函数吗? 或者我应该将数据保留为一个随意的字符数组,因为特殊符号会被错误地转换?

关于

【问题讨论】:

我对你想要做什么感到有点困惑。您是说您将位图(图像)文件中的原始位存储在 std::string 中吗?如果是这样,那么您可能不想这样做,因为您拥有的数据不是字符串(字符/glpyh)数据。 MBCS->UNICODE 转换在这里根本没有意义。您要解决的更大的问题是什么? 我编写了一个通过套接字发送数据的函数。该函数将 std::wstring 作为参数...如果我没有得到转换,我需要重写此函数以获取 char* 和缓冲区的长度或类似的东西,我真的不想要.. . 但如果那是留给我的任何东西...... 重写函数,完全不适合发送二进制数据。 thx... 请将其发布为答案,以便我评价它 @Incubbus - 您的“通过套接字发送数据的功能”需要重新设计。由于您的问题被标记为 C++,因此请考虑提供支持正确编组字符串、wstring 和二进制数据的重载。 【参考方案1】:

使用这种方法会有很多、很多的事情会失败。除此之外,额外的字节可能会在您没有意识到的情况下添加到您的数据中。

奇怪的是,您唯一的选择是 std::wstring()。如果这是一个自制的库,您应该不厌其烦地编写一个新函数。如果不是,请在编写自己的之前确保没有更合适的。

【讨论】:

以上是关于字符串转换:MBCS <-> UNICODE 内有多个 \0的主要内容,如果未能解决你的问题,请参考以下文章

SAPHANA学习(21):SQL Function(U)

UnicodeEncodeError:'mbcs'编解码器无法编码位置0--1中的字符:运行PyInstaller编译的脚本时无效字符

MBCS 应用程序是不是支持公共控件 6?

vc6开发环境由MBCS改成UNICODE

VC2015提示warning C4996: 'MBCS_Support_Deprecated_In_MFC': MBCS support in MFC is dep

VS 2013 中弃用 MBCS 对 MFC 的支持的副作用