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 类别 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::stringstd::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 回答