2

コード:

#include <fstream>

const wchar_t * testArray[] =
{
    L"Wszystkie kategorie równoważne",
    L"Oczekiwane przepływy pieniężne",
    L"Risk i dojrzałość",
    L"Pozycja strategiczna i lata na rynku",
    L"Prawdopodobieństwo oszacowania"
};

void FaultyFunction(void)
{
    std::wofstream file("test.txt");
    for (int i = 0 ; i < 100 ; ++i)
    {
        for (int j = 0 ; j < 5 ; ++j)
        {
            file << testArray[j] << L'\t';
        }
        file << L'\n';
    }
}

int main(void)
{
    FaultyFunction();
    return 0;
}

実行後の「test.txt」:

Wszystkie categorie równowa

(はい、それはファイル全体です!)

さて、それがファイルのエンコーディングの問題なのか、それとも何の問題なのかはわかりませんstd::wofstreamが、結果は少なくとも奇妙です。しかし、ポーランド語の文字を削除すると:

const wchar_t * testArray[] =
{
    L"Wszystkie kategorie rownowazne",
    L"Oczekiwane przeplywy pieniezne",
    L"Risk i dojrzalosc",
    L"Pozycja strategiczna i lata na rynku",
    L"Prawdopodobienstwo oszacowania"
};

ファイルの内容は期待どおりです。

Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania
Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania
Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania
... (残りの 97 行はこのように続きます)

そして、まったく同じものtestArray(ポーランド語の文字を使用) を使用して *.xls ファイル (libxl ライブラリを使用) にいくつかのことを書き込むと、怪我に侮辱を加えるために、すべてが正常に機能します

どうしたの?ポーランド語の文字をテキスト ファイルに保存するにはどうすればよいですか?

編集: 実際には、同じコードを試してみましたが、std::stringand std::ofstream(幅が広くない)でもうまくいきました(ポーランド語の文字)。では、ワイド文字の問題は何ですか?

4

1 に答える 1

1

StackOverflow、MSDN、CodeGuru、CodeProject などですでに何十回も議論されています。ただし、Visual Studio 2013 で準備された C++ コンソール アプリケーションの次のコードが役立つ可能性があります。

#include "stdafx.h"     // added by Visual Studio
#include <fstream>
#include <iostream>
#include <codecvt>
#include <locale>
#include <fcntl.h>
#include <io.h>

const std::locale utf8_locale = std::locale(std::locale(),
    new std::codecvt_utf8<wchar_t>());      // prepare parameter for imbue call
const wchar_t* testArray[] =
{
    L"Wszystkie kategorie równoważne",
    L"Oczekiwane przepływy pieniężne",
    L"Risk i dojrzałość",
    L"Pozycja strategiczna i lata na rynku",
    L"Prawdopodobieństwo oszacowania"
};

void FaultyFunction(void)
{
    _setmode(_fileno(stdout), _O_U16TEXT); // for debugging; if omitted then
                                           // std::wcout would be truncated as well
    std::wofstream test_file("test.txt");
    // test_file << L"\xEF\xBB\xBF";     // Byte Order Mark: not required nor recommended
                                         //       important: write BOM before imbue
    test_file.imbue(utf8_locale);        // set the locale of the stream (and buffer
                                         //       if any) to the specified locale
    for (int i = 0; i < 10; ++i)
    {
        for (int j = 0; j < 5; ++j)
        {
            test_file << testArray[j] << L'\t';
            // std::wcout << testArray[j] << L'\n';  // for debugging
        }
        test_file << L'\n';
    }
}

int main(void)
{
    FaultyFunction();
    return 0;
}
于 2016-04-23T16:36:19.247 に答える