从无符号char*到常量wchar_t*的转换
conversion from unsigned char* to const wchar_t*
我正在使用以下代码将字符串从unsigned char*
转换为const wchar_t*
。我得到的错误是,只有几个单词被正确转换,而其余的都是乱码值。
代码
unsigned char* temp = fileUtils->getFileData("levels.json", "r", &size);
const char* temp1 = reinterpret_cast<const char*>(temp);
size_t len = mbstowcs(nullptr, &temp1[0], 0);
if (len == -1) {
} else {
wchar_t* levelData = new wchar_t();
mbstowcs(&levelData[0], &temp1[0], size*10);
}
输出
temp1 = "[{"scaleFactor": 1}][{"scaleFactor": 2}][{"scaleFactor": 3}][{"scaleFactor": 4}][{"scaleFactor": 5}][{"scaleFactor": 6}][{"scaleFactor": 7}][{"scaleFactor": 8}][{"scaleFactor": 9}][{"scaleFactor": 10}]"
levelData = "[{"scaleFactor": 1}][{"scaleFactor": 2}][{"scaleFactor": 3}][{"scaleFactor": 4}][{"scaleFactor": 5}][{"scaleFactor": 6}][{"scaleFactor": 7}][{"s慣敬慆瑣牯㨢㠠嵽筛猢慣敬慆瑣牯㨢㤠嵽筛猢慣敬慆瑣牯㨢ㄠ細ﵝ﷽ꮫꮫꮫﺫﻮ"
wchar_t* levelData = new wchar_t();
mbstowcs(&levelData[0], &temp1[0], size*10);
这只为一个字符分配了足够的内存。这还不足以存储字符串,所以事情当然不会正常工作。
另外,10
是从哪里来的?
如果要动态分配缓冲区(使用new(,则不需要硬编码缓冲区大小。
wchar_t* levelData = new wchar_t[len+1];
mbstowcs(&levelData[0], &temp1[0], len);
感谢@BenVoigt,发现了错误。将代码更改为此-
wchar_t levelData[200];
mbstowcs(&levelData[0], &temp1[0], size);
unsigned char* temp = fileUtils->getFileData("levels.json", "r", &size);
const char* temp1 = reinterpret_cast<const char*>(temp);
wchar_t* levelData = new wchar_t[size];
int last_char_size = 0;
mbtowc(NULL, 0, 0);
for (wchar_t* position = levelData; size > 0; position++)
{
last_char_size = mbtowc(position, temp1, size);
if (last_char_size <= 0) break;
else {
temp1 += last_char_size;
size -= last_char_size;
}
}
if (last_char_size == -1)
{
std::cout << "Invalid encoding" << std::endl;
}
delete[] temp; // * probably
标记线(*(取决于fileUtils->getFileData
是否为temp
分配内存块,而fileUtils
的对象是否自己管理它。——这是最有可能的。但是,您应该查看文档。
size
对于levelData
数组来说应该足够大,而在[]
中,您指定的是数组的元素数,而不是字节数(也称为char
s(在这种情况下,它是宽字符的数量。不能再多了,然后读取char
s.
您应该注意的另一件事是,fileUtils->getFileData
可能读取二进制日期。因此temp
中的文本后面没有0。因此,稍后调用的字符串函数(如wcstok
(会让你大吃一惊
还有彼此。如果你不熟悉的结构
function_on_arrays( target, source, size )
请记住,您在C/C++中的程序不知道target
和source
的大小。但很可能,你不想让函数做一些超出它们的事情。所以这就是size
的主要功能。-你的手动方式,关于你想执行多少元素的操作,不要超出数组的数据。
编辑:早期的解决方案是错误的,因为错误地将mbstowcs
的最后一个参数视为源中的字符数。
相关文章:
- 无法将参数 1 从 WCHAR 转换为常量字符 *
- 如何将CString转换为使用WCHAR的Windows API和自定义函数?
- VC++ 2017 如何将常量wchar_t转换为 WCHAR *.
- 将WCHAR转换为LPCTSTR
- 在C++中读取和写入Windows注册表(如何将字符串转换为wchar(?))
- 在 unicode 中将 WCHAR 数组转换为 std::string?
- 将const wchar_t*转换为wchar*
- 将字符从 fget 转换为 Wchar*
- 如何在 iOS 中将 UTF-8 字符串转换为 wchar
- 如何将const char*转换为const WCHAR*
- 如何将wchar_t(或wchar_t*或CORBA::WChar*)转换为字符串
- 如何将strncpy()转换为WCHAR
- 通过COM将C#字符串转换为C++WCHAR*
- 将wchar转换为字符串并推入矢量(C/C++)
- 将 WCHAR[260] 转换为 std::string
- 无法将char*转换为WCHAR*[qt/c++]
- 在WCHAR*和wstring之间转换,而不使用构造函数
- 将std::string转换为GDI+参数所需的const WCHAR*字符串
- 如何在C++中将WCHAR*转换为字符串,反之亦然
- "strcpy":无法将参数 2 从"WCHAR *"转换为"常量字符 *