1
#ifndef UNICODE
#define UNICODE
#endif

#include <Windows.h>
#include <cstdio>
#include <fstream>

using namespace std;

int main()
{
    FILE* resFile;
    char multiByteStr[256];
    ifstream oFile;
    FILE* exampleFile;
    TCHAR buffer[256];      
    system("chcp 65001");

    resFile = _wfopen(L"foo",L"w, ccs=UTF-8");             
    fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt");    
    fclose(resFile);   

    oFile.open(L"foo");    
    oFile.getline(multiByteStr,256,'\n');       
    oFile.close();    

    MultiByteToWideChar(CP_UTF8,0,multiByteStr,256,buffer,256);    
    wprintf(L"%s",buffer);

    exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE");       
    fwprintf(exampleFile,L"%s",buffer);     
    fclose(exampleFile);

    system("pause");
    return 0;
}

ご覧のとおり、プログラムは作成するファイルresFileのフルパスを含むファイル「foo」を作成する必要があり、この新しいファイルexampleFileにはそれ自体へのパスが含まれている必要があります。Visual Studio 2010でのデバッグ中に、autosはそのバッファーに正しい文字列が含まれるようにしますが、exampleFileは作成されません。なんで?
そしてもう1つwprintf、コンソールのフォントをLucida Consoleに切り替えたのに、なぜ拡張文字が出力されないのですか?コード化されていない文字を処理できるものです。

追伸 NULLexampleFileは、の後でさえもを指し_wfopen、バッファの最後の文字は。です'/0'

4

3 に答える 3

2

エラー処理は行っていません。最も重要なのは、を呼び出すときに、バッファMultiByteToWideChar()全体を変換するように指示していることですがmultiByteStr、事前にゼロに設定していないため、ほとんどのバッファにはガベージが含まれています。バッファの最大サイズではなく、バッファ内の実際の文字数を使用する必要があります。MultiByteToWideChar()無視しているエラーを返す可能性があります。コードには他にもいくつかの障害箇所があります。特にOSと対話するときは、常にエラーをチェックする必要があります。

これを試して:

#define UNICODE

#include <Windows.h>
#include <cstdio>
#include <fstream>

using namespace std;

void pause()
{
    wcin.ignore();
    wcin.get();
}

int main()
{
    FILE* resFile;
    char multiByteStr[256] = {0};
    ifstream oFile;
    FILE* exampleFile;
    WCHAR buffer[256] = {0};

    SetConsoleOutputCP(CP_UTF8);

    resFile = _wfopen(L"foo",L"w, ccs=UTF-8");
    if (!resFile) {
        wprintf(L"Unable to create foo");
        goto done;
    }

    fwprintf(resFile,L"%s",L"C:\\exsistingFolder\\zażółć gęśłą jaźń ☺☻♥♦• ć.txt");
    fclose(resFile);

    if (!oFile.open(L"foo")) {
        wprintf(L"Unable to open foo");
        goto done;
    }

    oFile.getline(multiByteStr,255,'\n');
    oFile.close();

    if (MultiByteToWideChar(CP_UTF8,0,multiByteStr,-1,buffer,256) == 0) {
        wprintf(L"Unable to convert UTF-8 to UTF-16. Error: %u", GetLastError());
        goto done;
    }

    exampleFile = _wfopen(buffer,L"w, ccs=UTF-16LE"); 
    if (!exampleFile) {
        wprintf(L"Unable to create file: %s", buffer);
        goto done;
    }

    fwprintf(exampleFile,L"%s",buffer); 
    fclose(exampleFile);

    wprintf(L"created file: %s", buffer);

done:
    pause();
    return 0;
}
于 2012-05-27T17:04:14.973 に答える
1

解決策は非常に簡単です。_wfopenはBOMを使用してUTF-8エンコードされたファイルを作成し、MultiByteToWideChar関数はBOMを削除しないため、手動でこれを取り除く必要があります。

于 2012-05-29T18:21:22.753 に答える
1

I/O ライブラリを組み合わせる理由 エラーチェックを除いた純粋な(Windows)Cソリューションは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE* pFile;
    wchar_t buffer[256];

    _wfopen_s(&pFile,L"foo",L"w, ccs=UTF-8");
    fputws(L"C:/existingFolder/zażółć gęśłą jaźń ☺☻♥♦• ć.txt",pFile);
    fclose(pFile);

    _wfopen_s(&pFile,L"foo",L"r, ccs=UTF-8");
    fgetws(buffer,_countof(buffer),pFile);
    fclose(pFile);

    _wfopen_s(&pFile,buffer,L"w, ccs=UTF-16LE");
    fputws(buffer,pFile);
    fclose(pFile);

    return 0;
}
于 2012-05-28T01:00:31.503 に答える