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

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は完全に十分なサイズである必要があります。・この場合はワイド文字数です。それ以上のことはできません。それからsを読んでください。levelData[]charchar

注意すべきもう 1 つのことは、fileUtils->getFileDataおそらくバイナリ日付を読み取ることです。そのため、テキスト in のtemp後に 0 は続きません。したがって、後で文字列関数 (などwcstok) が呼び出されると、足を離します。

そしてお互い。構造に慣れていない場合

    function_on_arrays( target,  source,  size )

targetC/C++ のプログラムはとのサイズがわからないことを思い出してくださいsource。しかし、おそらく、関数にそれ以上のことをさせたくないでしょう。だから、これがsize主なものです。- 配列のデータを超えないようにするためにアクションを実行する要素の数について、手動で言う方法。

編集:mbstowcsの最後のパラメーターをソース内の文字数 として誤って扱ったため、以前の解決策は間違っていました。

于 2013-05-17T20:31:33.343 に答える