2

以下代码按预期工作。源代码、文件“file.txt”和“out.txt”均采用utf8编码。但是当我在第一行更改wchar_t为. 我已经尝试过 gcc5.4 和 clang8.0 。我的目标是替换为, 因为在 RAM 中需要两倍的空间。我认为这两种类型在 c++11 及更高版本的标准中同样得到很好的支持。我在这里想念什么?char16_tmain()-std=c++11wchar_tchar16_twchar_t

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

int main(){
  typedef wchar_t my_char;

  std::locale::global(std::locale("en_US.UTF-8"));

  std::ofstream out("file.txt");
  out << "123正则表达式abc" << std::endl;
  out.close();

  std::basic_ifstream<my_char> win("file.txt");
  std::basic_string<my_char> wstr;
  win >> wstr;
  win.close();

  std::ifstream in("file.txt");
  std::string str;
  in >> str;
  in.close();

  std::wstring_convert<std::codecvt_utf8<my_char>, my_char> my_char_conv;
  std::basic_string<my_char> conv = my_char_conv.from_bytes(str);

  std::cout << (wstr == conv ? "true" : "false") << std::endl;

  std::basic_ofstream<my_char> wout("out.txt");
  wout << wstr << std::endl << conv << std::endl;
  wout.close();

  return 0;
}

编辑

修改后的代码不能用 clang8.0 编译。它使用 gcc5.4 编译,但在运行时崩溃,如 @Brian 所示。

4

1 回答 1

6

各种流类需要一组定义才能运行。标准库仅需要 and 的相关定义和对象charwchar_t而不需要char16_tor char32_t。在我的脑海中,使用std::basic_ifstream<cT>or需要以下内容std::basic_ofstream<cT>

  1. std::char_traits<cT>指定字符类型的行为方式。我认为这个模板专门用于char16_tchar32_t.
  2. usedstd::locale需要包含std::num_put<cT>facet 的实例以格式化数字类型。这个方面可以被实例化,并且std::locale可以创建一个包含它的新方面,但标准不要求它存在于std::locale对象中。
  3. usedstd::locale需要包含 facet 的实例std::num_get<cT>以读取数字类型。同样,可以实例化此方面,但默认情况下不需要存在。
  4. 方面std::numpunct<cT>需要专门化并放入用于std::locale处理小数点、千位分隔符和文本布尔值。即使它没有真正使用,它也会被数字格式化和解析函数引用。char16_tor没有现成的特化char32_t
  5. 分面std::ctype<cT>需要专门化并放入使用的分面中,以支持字符类型的加宽、缩小和分类。char16_tor没有现成的特化char32_t
    1. 方面std::codecvt<cT, char, std::mbstate_t>需要专门化并放入用于std::locale在外部字节序列和内部“字符”序列之间进行转换。char16_tor没有现成的特化char32_t

大多数方面都相当容易做到:它们只需要转发一个简单的转换或进行表查找。然而,这个std::codecvt方面往往相当棘手,特别是因为std::mbstate_t从标准 C++ 库的角度来看,它是一种不透明类型。

所有这些都可以做到。自从我上次对字符类型进行概念验证实现以来已经有一段时间了。我花了大约一天的时间。当然,当我开始着手实施语言环境和 IOStreams 库的工作时,我知道我需要做什么。添加合理数量的测试而不仅仅是一个简单的演示可能需要我一周左右的时间(假设我实际上可以专注于这项工作)。

于 2016-12-24T21:02:45.417 回答