Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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
fstream::open()Unicode或非Ascii字符不';无法在Windows上工作(使用std::ios::out) 在C++项目中,我想打开一个文件( fSt::OPEN()/Cux>)(这似乎是一个主要问题)。我的程序的Windows版本失败得很惨_C++_Windows_Unicode_Utf 8_Fstream - Fatal编程技术网

fstream::open()Unicode或非Ascii字符不';无法在Windows上工作(使用std::ios::out) 在C++项目中,我想打开一个文件( fSt::OPEN()/Cux>)(这似乎是一个主要问题)。我的程序的Windows版本失败得很惨

fstream::open()Unicode或非Ascii字符不';无法在Windows上工作(使用std::ios::out) 在C++项目中,我想打开一个文件( fSt::OPEN()/Cux>)(这似乎是一个主要问题)。我的程序的Windows版本失败得很惨,c++,windows,unicode,utf-8,fstream,C++,Windows,Unicode,Utf 8,Fstream,文件“ä”(UTF-8 0xC3 0xA4) 字符串s是UTF-8编码的,但随后从UTF-8转换为拉丁文1(0xE4)。我使用的是Qt,所以QString::fromUtf8(s.c_str()).toLocal8Bit().constData() 为什么我可以打开文件阅读,但不能写入 文件“imk_”(UTF-8 0xD0 0xB8) 同样的代码,根本不起作用 看起来,这个字符不适合Windows-1252字符集。如何打开这样的fstream(我没有使用MSVC,所以)?在Windows上使

文件“ä”(UTF-8 0xC3 0xA4)

字符串
s
是UTF-8编码的,但随后从UTF-8转换为拉丁文1(0xE4)。我使用的是Qt,所以
QString::fromUtf8(s.c_str()).toLocal8Bit().constData()

为什么我可以打开文件阅读,但不能写入

  • 文件“imk_”(UTF-8 0xD0 0xB8)

    同样的代码,根本不起作用

  • 看起来,这个字符不适合Windows-1252字符集。如何打开这样的fstream(我没有使用MSVC,所以)?

    在Windows上使用标准API(如std::fstream),如果文件名可以使用当前设置的“ANSI代码页”(CP_ACP)编码,则只能打开文件

    这意味着可能存在无法在Windows上使用这些API打开的文件。除非微软实现了将CPYACP设置为CPUTUF8的支持,否则这不能用微软的CRT或C++标准库实现。 (Windows有一个名为“短”文件名的功能,启用该功能后,驱动器上的每个文件都有一个ASCII文件名,可以通过标准API使用。但是该功能正在消失,因此它并不代表一个可行的解决方案。)


    更新:Windows 10增加了对将代码页设置为UTF-8的支持。在STL的Microsoft实现中,有一个非标准扩展(重载)允许unicode支持UTF-16编码字符串

    只需将UTF-16编码的std::wstring传递给fstream::open()。这是使用fstream的唯一方法


    您可以在这里阅读更多关于我发现的在windows上支持unicode的最简单方法:

    我认为windows中的文件名需要UTF-16编码,并且您需要使用特殊的windows文件处理功能(
    \u wfopen
    等)通过长名称访问文件。或者,您可以使用短名称。您使用的编译器和C库是什么?如果您正在使用,比如说,MinGW,您仍然可以使用MS-CRT中的函数,例如。如果使用不同的C运行时(例如CygWin GCC的LIB),那么你就受运行库的Unicode支持的支配。C和C++标准库需要支持Unicode(即它们必须将UTF-8输入字符串转换成UTF-16,然后调用<代码> CreateFileW < /代码>)。如果他们不这样做,你就不走运了——你可能需要直接调用
    CreateFileW
    。@Adam Rosenfield我使用的是mingw32-g++-4.6.2_wfopen()返回一个FILE*指针,如何以这种方式打开fstream对象?@basic6:很遗憾,我不知道是否有办法。这个类是存在的,但是它的
    open
    方法也只接受
    const char*
    作为文件名。如果您希望能够打开Unicode文件名,您需要使用C的stdio库,或者通过将文件数据全部读入内存并使用
    std::stringstream
    解析数据来完全缓冲文件数据。这可能是合适的解决方案,但是这种重载仅适用于MSVC,而不适用于MinGW(我不使用微软的编译器,因为我没有把我当前正在处理的代码移植到微软的C++中(换句话说,代码不会编译,我还没有找出原因)。@ Basic6:请阅读该部分。
    std::string s = ...;
    //Convert s
    std::fstream f;
    f.open(s.c_str(), std::ios::binary | std::ios::in); //Works (f.is_open() == true)
    f.close();
    f.open(s.c_str(), std::ios::binary | std::ios::in | std::ios::out); //Doesn't work