C++ std::stringstream/ostringstream 和 UTF 字符

标签 c++ utf-8 stringstream ofstream ostringstream

我正在编写一个程序来处理一些数据,将其输出到一个 .csv 文件,然后编写一个 GNUplot 脚本,然后调用 GNUplot 来执行该脚本并创建一个具有相同名称(只是扩展名不同)的图像文件.文件名包含 UTF 字符(我相信是 UTF-8?),例如 °、φ 和 θ。当我使用 g++ 4.4.7 在 Linux 中编译和执行它时,所有这些都工作得很好。然后我更改了我的代码以在 Microsoft Visual Studio 2008 中编译,当我运行该程序时问题就开始了。

我使用以下两段代码

  1. 制作一个标准的文件名字符串(我只是为各种文件添加扩展名)
  2. 打开流以写入文件(GNUplot 脚本和 .csv 文件之间的唯一区别是扩展名

    // Generate a file name string
    stringstream ss;
    ss << type << " Graph #" << gID << " - " << title;
    string fileName = ss.str();
    
    // Open a stream for the output file
    ostringstream outfile;
    outfile << fileName << ".gplt" << ends;
    ofstream ofs( outfile.str().c_str() );
    

ofs 写入的 ofstream 文件的内容正确包含 UTF 字符,但是 stringstream 创建的字符串 fileNameostringstream 创建的文件名(即使不是用 fileName 创建的,我测试过它)显示的字符不正确。

例子:

What it should be - CDFvsRd Graph #32 - MWIR @ 300m, no-sun, 30kts, θ=all°.csv
What it ends up as - CDFvsRd Graph #32 - MWIR @ 300m, no-sun, 30kts, Ï=allË.csv

如何使用尽可能多的标准 C++ 来解决这个问题?将我的 fileName 字符串转换为 wstring 有帮助吗?

最佳答案

解决方案是编写代码的 Windows 部分,不导出没有图形标题的文件名,从文件名中省略 UTF-8 字符。这不是真正的解决方案,只是一种变通方法。

关于C++ std::stringstream/ostringstream 和 UTF 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24997101/

相关文章:

c++ - 需要慢速插入链表多线程吗?

c++ - 如何使用OpenCV在不同的显示器上显示不同的窗口

c++ - 如何读取动态大小的stringstream?

c++ - 如何清除字符串流?

c++ - 组合框在调整大小时隐藏

c++ - 散列一个无序的小整数序列

python - Unicode解码错误: 'utf8' codec can't decode byte 0xb4 in position 98: invalid start byte

java - 正确地将编码设置为 UTF-8,即使这样电子邮件也会出现 ?和�

c++ - `std::u8string` 必须是 UTF-8 吗?

C++ stringstreams with std::hex