在Linux上C++编写UTF-8 [英] C++ writing UTF-8 on Linux
本文介绍了在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。
这篇关于在Linux上C++编写UTF-8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文