0

我正在使用以下代码将字符串从 转换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慣敬慆瑣牯㨢㠠嵽筛猢慣敬慆瑣牯㨢㤠嵽筛猢慣敬慆瑣牯㨢ㄠ細ﵝ﷽꯽ꮫꮫꮫﺫﻮ"
4

4 回答 4

2
wchar_t* levelData = new wchar_t();
mbstowcs(&levelData[0], &temp1[0], size*10);

这为恰好一个字符分配了足够的内存。这还不足以存储你的字符串,所以事情当然不会正常工作。

还有,那10是哪来的?

于 2013-05-17T12:27:40.980 回答
1

如果要动态分配缓冲区大小(使用新的),则不需要对缓冲区大小进行硬编码。

wchar_t* levelData = new wchar_t[len+1];
mbstowcs(&levelData[0], &temp1[0], len);
于 2013-05-17T12:41:37.027 回答
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,而[]您指定数组元素的数量,而不是字节数(也称为chars)。- 在这种情况下,它是宽字符的数量。哪个不能多,那就读chars吧。

您应该注意的另一件事是,fileUtils->getFileData可能读取二进制日期。所以输入的文本temp后面没有 0。所以,稍后wcstok调用它的字符串函数——比如——会让你大吃一惊。

还有一个。如果你不熟悉建筑

    function_on_arrays( target,  source,  size )

请记住,您的 C/C++ 程序不知道 和 的target大小source。但很可能,您不希望该函数做超出它们的事情。所以这size主要是什么。- 您的手动方式表示,您希望执行多少个元素以不超出数组数据的范围。

编辑: 早期的解决方案是错误的,因为错误地将最后一个参数mbstowcs视为源中的字符数。

于 2013-05-17T20:31:33.343 回答
0

感谢@BenVoigt,发现了错误。将代码更改为此-

wchar_t levelData[200];
mbstowcs(&levelData[0], &temp1[0], size);
于 2013-05-17T12:38:43.307 回答