在阅读了std::wstring VS std::string之后,我的印象是对于Linux,我不需要担心使用该语言的任何宽字符工具。
*诸如:std::wifstream、std::wofstream、std::wstring、whar_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, "");