1

在阅读了std::wstring VS std::string之后,我的印象是对于Linux,我不需要担心使用该语言的任何宽字符工具。
*诸如:std::wifstreamstd::wofstreamstd::wstringwhar_t等。

当我仅将 std::strings 用于非 ascii 字符时,这似乎很好,但当我使用 chars 处理它们时则不然。

例如:我有一个文件,其中只有一个 unicode 复选标记。
我可以将其读入,将其打印到终端,然后将其输出到文件中。

// ✓ reads in unicode to string
// ✓ outputs unicode to terminal
// ✓ outputs unicode back to the file
#include <iostream>
#include <string>
#include <fstream>

int main(){
  std::ifstream in("in.txt");
  std::ofstream out("out.txt");

  std::string checkmark;
  std::getline(in,checkmark); //size of string is actually 3 even though it just has 1 unicode character

  std::cout << checkmark << std::endl;
  out << checkmark;

}

但是,如果我使用 char 代替 std::string,则相同的程序不起作用

// ✕ only partially reads in unicode to char
// ✕ does not output unicode to terminal
// ✕ does not output unicode back to the file
#include <iostream>
#include <string>
#include <fstream>

int main(){
  std::ifstream in("in.txt");
  std::ofstream out("out.txt");

  char checkmark;
  checkmark = in.get();

  std::cout << checkmark << std::endl;
  out << checkmark;

}

终端中什么都没有出现(除了换行符)。
输出文件包含â而不是复选标记字符。

由于 char 只有一个字节,我可以尝试使用 whar_t,但它仍然不起作用:

// ✕ only partially reads in unicode to char
// ✕ does not output unicode to terminal
// ✕ does not output unicode back to the file
#include <iostream>
#include <string>
#include <fstream>

    int main(){
      std::wifstream in("in.txt");
      std::wofstream out("out.txt");

      wchar_t checkmark;
      checkmark = in.get();

      std::wcout << checkmark << std::endl;
      out << checkmark;

    }

我还阅读了有关设置以下语言环境的信息,但似乎没有什么不同。

setlocale(LC_ALL, "");
4

1 回答 1

3

在 std::string 案例中,您读取一行,在我们的案例中包含一个多字节 Unicode 字符。在 char 情况下,您读取一个字节,甚至不是一个完整的字符。

编辑:对于 UTF-8,您应该读入一个 char 数组。或者只是 std::string ,因为它已经有效。

于 2014-08-20T01:42:15.990 回答