在Linux上C++编写UTF-8

2022-06-10 00:00:00 utf-8 internationalization fopen c++

我在Windows上使用Visual Studio用C++编写了以下代码:

  FILE* outFile = fopen(outFileName, "a,ccs=UTF-8");
  fwrite(buffer.c_str(), buffer.getLength() * sizeof(wchar_t), 1, outFile);
  std::wstring newLine = L"
";
  fwrite(newLine.c_str(), sizeof(wchar_t), 1, outFile);
  fclose(outFile);
这将正确地写出UTF-8格式的文件。 当我在Linux上编译和运行相同的代码时,文件被创建,但它的长度为零。如果我按如下方式更改fopen命令,则会创建长度为非零的文件,但所有非ASCII字符都显示为垃圾:

  FILE* outFile = fopen(outFileName, "a");

ccs=utf-8不支持linux吗,GCC?


解决方案

不行,在linux、OS-X、安卓、iOS等系统上做的扩展都不能用。Microsoft进行这些扩展只是为了实现您编写与其他平台不兼容的代码。

将宽字符串转换为包含UTF-8的字节字符串,然后像往常一样将字节写入文件。 有很多方法可以做到这一点,但大多数与标准兼容的方法可能是这样的:

#include <iostream>
#include <string>
#include <codecvt>
#include <locale>

using Converter = std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t>; 

int main()
{
    std::wstring wide = L"?? Tiib ??";
    std::string u8 = Converter{}.to_bytes(wide);
    // note: I just put the bytes out to cout, you want to write to file
    std::cout << std::endl << u8 << std::endl; 
}

Demo is there.它使用g++8.1.0,但g++4.9.x可能也可以。

请注意,当任何人需要在Linux上使用宽字符串时,这种情况很少见,因为那里的大多数代码仅使用UTF8。

相关文章