在Linux上C++编写UTF-8
我在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。
相关文章