如何将char(包含非拉丁字符)转换为utf8 / utf16 wchar / char16_t?

问题描述 投票:-1回答:2

我想转换类型为char*的字符串,该字符串由非拉丁字符组成。

我已经尝试编写代码来做到这一点:

const char str[] = "磨";
const size_t cSize = strlen(str)+1;
wstring ws(cSize, L'#');
mbstowcs(&ws[0], str, cSize);

但是它不起作用。

有可能这样做吗?

c++ unicode ansi
2个回答
0
投票

您在这里混合使用C标准库和C ++ STL。除非您真的了解两者之间的相互作用,否则不要这样做。

您对mbstowcs的参数在某些方面是错误的。首先,您提供的指针完全不能保证指向wstring实例内部的内存-很有可能并非如此。上一次我为正在处理的项目编写字符串类时,该语句将导致堆栈损坏。

第二,大小参数计算不正确。由于多字节字符串通常比其等效的宽字符串包含代码单元包含更多的字节,因此在这里是可以的,但是采用其他方法会导致问题。

从多字节到宽字符的正确转换方法如下:

const char* pMBString = ...;
size_t DestLen = mbtowcs(nullptr, pMBString, 0)  +1; //Account for null terminator
wchar_t* pWString = new wchar_t[DestLen];
size_t ConvertedCount = mbtowcs(pWString, pMBString, DestLen);
if(ConvertedCount == (size_t)-1)
{
    //Conversion failed - invalid character or not enough space.
}

此时,pWString包含转换为宽字符的原始字符串。

此方法取决于原始函数的POSIX扩展-如果目标指针为null,则该函数返回存储字符串所需的宽字符数,不计算空终止符。这就是为什么在分配目标之前需要将结果加1。

要转换回去,只需反转功能并改用wcstomb


-1
投票

好吧,我不太清楚,但是在Windows中,您可以尝试导入WinNT.h模块并在字符类型定义的值之前声明一个'L'。

#include <winnt.h>
.
.
.

int main()
{
     PSTR *c = L'c';  // char*
     PWSTR *w = L'w_char';  // wchar_t*     
     return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.