我使用以下代码将字符串从unsigned char*
转换为const wchar_t*
。我得到的错误是只有几个单词正在被正确转换,而其余的是乱码值。
CODE
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慣敬慆瑣牯㨢㠠嵽筛猢慣敬慆瑣牯㨢㤠嵽筛猢慣敬慆瑣牯㨢ㄠ細ﵝ﷽ꮫꮫꮫﺫﻮ"
答案 0 :(得分:3)
wchar_t* levelData = new wchar_t();
mbstowcs(&levelData[0], &temp1[0], size*10);
为一个字符分配了足够的内存。这还不足以存储你的字符串,所以当然事情不会正常。
此外,10
来自哪里?
答案 1 :(得分:1)
如果您要动态分配缓冲区大小(使用新的),则无需对缓冲区大小进行硬编码。
wchar_t* levelData = new wchar_t[len+1];
mbstowcs(&levelData[0], &temp1[0], len);
答案 2 :(得分:0)
感谢@BenVoigt,发现了错误。将代码更改为此 -
wchar_t levelData[200];
mbstowcs(&levelData[0], &temp1[0], size);
答案 3 :(得分:0)
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
数组来说应该足够大,而在[]
中指定数组的元素数,而不是字节数(也就是{{1} }} S)。 - 在这种情况下,它是宽字符的数量。哪个不能多,请阅读char
s。
您应该注意的另一件事是,char
可能会读取二进制日期。因此,fileUtils->getFileData
中的文字后面跟不是0.因此,稍后调用它的字符串函数(如temp
)会将你的脚踢掉。
彼此。如果你不熟悉建筑
wcstok
请记住,您在C / C ++中的程序不知道 function_on_arrays( target, source, size )
和target
的大小。但可能,你不希望函数做一些超越它们的事情。所以这就是source
主要是什么。 - 您可以通过手动方式说明要执行操作的元素数量,以避免超出数组的数据。
修改强>
早期的解决方案是错误的,因为错误地将size
的最后一个参数视为源中的字符数。