如何在C ++中创建Unicode txt文件

时间:2016-03-01 09:22:49

标签: c++ file unicode

在Windows中创建.txt文件时,有四种编码选项。

  • ANSI
  • UNICODE(litte endian)
  • UNICODE(big endian)
  • UTF-8

Text File Encoding Option

C标准库支持此选项,方法是使用FILE

C STL

FILE* file;
file = _wfopen(L"test.txt", L"wt+,ccs=UTF-16LE");

它一直很好用,但我发现std::ofstream中没有参数。

wofstream myfile;
myfile.open("example.txt", ?????????);

所以,我想知道如何在C ++中创建这样的文件。在C ++ STL中有没有解决方案?

2 个答案:

答案 0 :(得分:4)

从C ++ 11开始,标准C ++库允许使用以下步骤生成UTF16文本文件:

  • 使用C ++ 11类std::codecvt_utf16构建语言环境 - 您可以在构造函数中指定字节顺序
  • 使用std::wofstream打开文件,您将在其中编写unicode文本
  • imbue区域设置放入宽流并开始编写,最后选择以字节顺序标记字符(U + FEFF)开头

这是一个改编自@HansPassant在其评论中引用的page的例子:

// codecvt_utf16: writing unicode string as UTF-16
#include <iostream>
#include <locale>
#include <string>
#include <codecvt>
#include <fstream>

int main ()
{
  std::wstring str ( { 0xa8, 0xa9 });

  std::locale loc (std::locale(), new std::codecvt_utf16<wchar_t>);
  std::basic_ofstream<wchar_t> ofs ("test.txt");
  ofs.imbue(loc);

  std::cout << "Writing to file (UTF-16)... ";
  ofs << (wchar_t) 0xfeff; // BOM
  ofs << str;
  std::cout << "done!\n";

  return 0;
}

你得到一个utf16文件,以一个小尾数BOM开头并包含èé

(十六进制转储:

$ od -xc test.txt
0000000      fffe    a800    a900
         376 377  \0 250  \0 251

答案 1 :(得分:1)

没有&#34; C STL&#34;。 STL代表标准模板库。 C没有模板。您可能指的是C标准库和C ++标准库。

C标准库没有&#34;创建unicode&#34;或将文本转换为unicode或从unicode转换文本。 C标准库中没有_wfopen。您正在使用Microsoft C运行时库中的函数。

C ++库确实有一个API可以在(UTF-8和UTF-16)和(UTF-8和UTF-32)以及(系统本机宽和系统本机多字节)编码之间进行转换:http://en.cppreference.com/w/cpp/locale/codecvt < / p>

标准库中几乎没有任何其他unicode支持。您必须注意您正在编写的字符串符合您希望的编码,如果需要,您必须明确写出BOM