在Linux上C++编写UTF-8 [英] C++ writing UTF-8 on Linux

查看:53
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆