Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加载并保存带有波兰语字符的HTML文件_C++_Encoding_Fstream_Polish - Fatal编程技术网

C++ 加载并保存带有波兰语字符的HTML文件

C++ 加载并保存带有波兰语字符的HTML文件,c++,encoding,fstream,polish,C++,Encoding,Fstream,Polish,我需要加载一个HTML模板文件(使用std::ifstream),添加一些内容,然后将其保存为一个完整的网页。如果不是波兰语字符,这就足够简单了——我已经尝试了char/wchar\t,Unicode/多字节字符集,iso-8859-2/utf-8,ANSI/utf-8的所有组合,但它们都不适合我(总是得到一些显示不正确的字符(或其中一些根本不显示) 我可以在这里粘贴很多代码和文件,但我不确定这是否会有帮助。但也许你可以告诉我:模板文件应该有什么格式/编码,我应该在其中声明什么编码用于网页,我应

我需要加载一个HTML模板文件(使用
std::ifstream
),添加一些内容,然后将其保存为一个完整的网页。如果不是波兰语字符,这就足够简单了——我已经尝试了
char
/
wchar\t
Unicode
/
多字节字符集,
iso-8859-2
/
utf-8
ANSI
/
utf-8
的所有组合,但它们都不适合我(总是得到一些显示不正确的字符(或其中一些根本不显示)

我可以在这里粘贴很多代码和文件,但我不确定这是否会有帮助。但也许你可以告诉我:模板文件应该有什么格式/编码,我应该在其中声明什么编码用于网页,我应该如何加载和保存该文件以获得正确的结果

(如果我的问题不够具体,或者您需要代码/文件示例,请告诉我。)

编辑: 我尝试了评论中建议的图书馆:

std::string fix_utf8_string(std::string const & str)
{
    std::string temp;
    utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));
    return str;
}
电话:

抛出:
utf8::没有足够的空间
-我做错了什么?

不确定这是否是(完美的)方式,但以下解决方案对我有效

我将HTML模板文件保存为ANSI(或者至少记事本++是这么说的),并更改了每次写入文件流的操作:

file << std::string("some text with polish chars: ąśżźćńłóę");
基本思想是使用
MultiByteToWideChar()
WideCharToMultiByte()
函数将字符串从ANSI(多字节)转换为wide char,然后从wide char转换为utf-8(更多信息:)。最好的部分是-我不需要更改任何其他内容(即
std::ofstream
std::wofstream
或使用任何第三方库或更改实际使用文件流的方式(而不是将字符串转换为utf-8,这是必要的))


可能也适用于其他语言,尽管我没有测试过。

请检查library@bash.d请查看对我的问题的编辑。@bash.d不幸的是,该库对我根本不起作用(即使没有抛出异常,它似乎仍然无法正确转换字符)。
file << std::string("some text with polish chars: ąśżźćńłóę");
file << ToUtf8("some text with polish chars: ąśżźćńłóę");
std::string ToUtf8(std::string ansiText)
{
    int ansiRequiredSize = MultiByteToWideChar(1250, 0, ansiText.c_str(), ansiText.size(), NULL, 0);
    wchar_t * wideText = new wchar_t[ansiRequiredSize + 1];
    wideText[ansiRequiredSize] = NULL;
    MultiByteToWideChar(1250, 0, ansiText.c_str(), ansiText.size(), wideText, ansiRequiredSize);
    int utf8RequiredSize = WideCharToMultiByte(65001, 0, wideText, ansiRequiredSize, NULL, 0, NULL, NULL);
    char utf8Text[1024];
    utf8Text[utf8RequiredSize] = NULL;
    WideCharToMultiByte(65001, 0, wideText, ansiRequiredSize, utf8Text, utf8RequiredSize, NULL, NULL);
    delete [] wideText;
    return utf8Text;
}