std::wofstream 将停止在非 ASCII 上写入

问题描述 投票:0回答:1

我正在尝试将扩展字符写入文件。

我的方法是使用

std::wofstream
,但下面的代码将写“foo”并停在那里(它不写,也不写酒吧)。

#include <fstream>

int main()
{
   {
      std::wofstream StreamFileWrite(L"C:\\out.txt");
      if (StreamFileWrite.is_open())
      {
         wchar_t f = 0x0066;
         StreamFileWrite << f;
         StreamFileWrite << L"oo";

         wchar_t c = 0x5C0F; //random unicode symbol
         StreamFileWrite << c;

         StreamFileWrite << L"bar";
      }
      StreamFileWrite.close();
   }
}

out.txt
包含“foo小bar”的正确做法应该是什么?

c++ unicode iostream
1个回答
0
投票

在 C++ 中向文件写入宽字符(如小)时遇到的问题通常是由字符编码和文件打开方式引起的。默认情况下,除非您显式设置区域设置,否则 std::wofstream 可能无法在 Windows 上正确处理 Unicode。

这是代码的修改版本,它适当地设置区域设置并使用正确的文件编码:

#include <fstream>
#include <locale>
#include <codecvt>

int main() {
    // Set the locale to handle UTF-8
    std::wofstream StreamFileWrite(L"C:\\out.txt");
    // Check if the file is opened successfully
    if (StreamFileWrite.is_open()) {
        // Set the locale to use UTF-8
        StreamFileWrite.imbue(std::locale(StreamFileWrite.getloc(), new std::codecvt_utf8<wchar_t>));

        // Write wide characters to the file
        StreamFileWrite << L"foo";
        wchar_t c = 0x5C0F; // Unicode character 小
        StreamFileWrite << c;
        StreamFileWrite << L"bar";
        
        // Close the file
        StreamFileWrite.close();
    } else {
        // Handle file open failure
        std::wcerr << L"Failed to open file for writing." << std::endl;
    }
    
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.