2016-09-14 8 views
0

私はいくつかのVS 2015 C++コードをAndroid Studio C++コードに変換しようとしています。WCHARとwchar_tを一般的なものに置き換える

My機能は、次のようになります。

int size = 0; 
int len = 0; 
fread(&size,sizeof(int),1,g_File); 

#ifdef VERBOSE  
    printf("fullSentences size = %d\n",size); 
#endif 

int i1 = 0; 
int i2 = 0; 
int i3 = 0; 
for(int i = 0; i < size; i++) 
{ 
    fread(&len,sizeof(int),1,g_File); 
    wchar_t *buff = new WCHAR[len+1]; 
    fread(buff,sizeof(WCHAR),len,g_File); 
    buff[len]=0; 
    fread(&i1,sizeof(int),1,g_File); 
    fread(&i2,sizeof(int),1,g_File); 
    fread(&i3,sizeof(int),1,g_File); 
    fullSentences.Add(buff,i1,i2,i3); 
    delete buff; 

    #ifdef VERBOSE  
     FullSentence fs = fullSentences.Content().back(); 
     printf("%s\t%d\t%d\n",fs.Text.c_str(),fs.ByteStart,fs.ByteCount); 
    #endif 
} 

私は移植容易にするためにはWCHARとwchar_tを取り除くしたいと思います。

誰かがこれらの代替品を提案できますか? 可能であれば、wchar_tが何であるかをAndroid Studioに伝える必要はありません。

ありがとうございます。

編集:ここでは

は、クラス情報は次のとおりです。

// 
// -------------------- clsFullSentences ----------------------------- 
// 
vector<FullSentence> &clsFullSentences::Content() 
{ 
    return m_content; 
} 
vector<wstring> &clsFullSentences::CleanLower() 
{ 
    return m_sCleanLower; 
} 
void clsFullSentences::LoadSerializedFullSentences(string uFile) 
{ 
    if (!fileExists(stringToWString(uFile))) 
    { 
     DebugBreak(); 
    } 

    FILE* inFile = fopen(uFile.c_str(), "rb"); 

    wchar_t signature[2]; 
    fread(signature, sizeof(wchar_t), 1, inFile); 

    wstring wline; 

    //read how many possibleresults we have  
    getLineW(inFile, wline); 

    unsigned int count=_wtoi(wline.c_str()); 

    for (unsigned int i = 0; i < count; i++) 
    { 
     FullSentence st; 

     getLineW(inFile,wline); 
     st.Text = wline; 

     //getLineW(inFile,wline); 
     st.Emotion =0;// _wtoi(wline.c_str()); 

     getLineW(inFile,wline); 
     st.ByteStart = _wtoi(wline.c_str()); 

     getLineW(inFile,wline); 
     st.ByteCount = _wtoi(wline.c_str()); 

     m_content.push_back(st); 
    } 

    fclose(inFile); 
} 
void clsFullSentences::Add(wstring text, int i1, int i2, int i3) 
{ 
    FullSentence fs; 
    fs.Text = text; 
    fs.Emotion = i1; 
    fs.ByteStart = i2; 
    fs.ByteCount = i3; 
    m_content.push_back(fs); 

    wstring sClean; 
    sClean=StripPuncToLower(text); 

    m_sCleanLower.push_back(sClean); 
} 

bool getLineW(FILE *inFile, wstring &result) 
{ 
    wchar_t data[2] = { 0, 0 }; 

    result = L""; 
    do 
    { 
     fread(data, sizeof(wchar_t), 1, inFile); 

     if (data[0] > 0) 
     { 
      if (data[0] != 13) 
      { 
       if (data[0] != 10) 
       { 
        result += data; 
       } 
       else 
       { 
        break;//10 is the end of the line 
       } 
      } 
     } 
    } while (!feof(inFile)); 

    if (result.size() > 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
+0

情報が不十分です:クラス定義を含む 'fullSentences'の宣言が必要です。 Windowsではwchar_tが2bytesだから、u/int16_tで置き換えることができますが、動作する保証はありません(fullSentencesはwchar_tバッファを受け取り、std :: stringのようなものを抽出できます)。 –

+0

@AdrianColomitchiありがとう、私はそれを追加しました。 – tmighty

+0

Unicode文字列を処理する唯一の移植可能な方法は、UTF-8でUTF-8を格納してからUTF-8をコードのwchar_tに変換することです。 –

答えて

1

あなたは、このコードは、WindowsとAndroid上で動作するようにしたい場合はandroid it is 4bytesにいる間、あなたは2バイトであるwchar_tはWindows上でそれを見つけるでしょう構築します。したがって、あなたはウィンドウにファイルを書き込むことができず、後でアンドロイド上で正しく読み込むことができません。そのような場合は、アンドロイドでchar16_tを使用し、アンドロイドの下で 'あなたの 選択'文字列に変換する必要があります。

(編集:あなたができる場合であっても良く、 - を確認してすべてのファイルがUTF8文字列として書かれている)「選びだし、文字列型」私が代わりにのstd、UTF8を使用することをお勧めについては

:: wstringはstd :: stringを使用します(utf8を使用してコード化されます)。私の経験から、NDKチームは、非常に初めからwchar_tの使用を控えていました(Cライブラリなどのw *関数がありません)。どうなっているのか分かりません。

私はもともとMFCでコード化されていたプロジェクトで作業し、アンドロイドに移植しました。最初のTCHARマクロから使用しました。これは、Unicode以外のビルドではchar型に、Unicode型ではwchar_tに解決されています。ですから、TCHARをどこからでも使用して、アンドロイドTCHARを使ってcharに解決する必要があります.WATCHを使用している間は(Windowsの下でユニコードを使用すると仮定していますか?)。

私はWindowsとAndroidプラットフォーム間でコードを共有するのに最適なソリューションであるとは言いませんが、アンドロイドのutf8への変換など、多くの問題があります。

1

UTF-8エンコーディングのテキストを含むstd::stringを使用してください。また、そのようなテキストのチェックと変換を処理するのに役立ついくつかのlightweight libraryが必要な場合があります。移植可能なコードでwchar_tstd::wstringを使用しないでください。

+0

自分のコードを変更することなく、VS2015とAndroid Studioの両方でutfcppを使用できるかどうか知っていますか?それは本当にクールだろう。 – tmighty

+0

@tmightyはい、すべてのプラットフォームでテキストを同じフォーマットに保ち、必要に応じてプラットフォーム固有のフォーマットに変換するために移植性と正確性を重視しています。私はVS2015で試してみませんでしたが、以前のバージョンのVSで動作しました。 –

+0

ありがとうございます。おそらく、 "UTF-8エンコーディングでテキストを含むstd :: stringを使用する"と少し説明してくれるでしょうか?それは私をたくさん助けます。 – tmighty

関連する問題