代码:
#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”:
Wszystkiekategorieró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::string
和std::ofstream
(不宽)尝试相同的代码时,它也可以正常工作(带波兰语字母)。那么宽字符有什么问题?
答案 0 :(得分:1)
Discussed on StackOverflow, MSDN, CodeGuru, CodeProject etc.已经数十次了。但是,在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;
}