После прочтения std :: wstring VS std :: string, У меня сложилось впечатление, что для Linux, Мне не нужно беспокоиться об использовании каких-либо широких возможностей языка.
*вещи как: станд :: wifstream, станд :: wofstream, станд :: wstring, whar_t, и т.п.
Кажется, что все идет хорошо, когда я использую только std :: strings для символов не-ascii, но не когда я использую символы для их обработки.
Например: у меня есть файл с галочкой в Юникоде.
Я могу прочитать его, распечатать на терминале и вывести в файл.
// ✓ 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;
}
Та же программа делает не работать, однако, если я использую символ вместо 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;
}
в терминале ничего не появляется (кроме новой строки).
Выходной файл содержит â
вместо символа галочки.
Так как символ только один байт, я мог бы попытаться использовать 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, "");
В случае std :: string вы читаете одну строку, которая в нашем случае содержит многобайтовый символ Unicode. В случае символа вы читаете один байт, который не является ни одним завершенным символом.
Изменить: для UTF-8 вы должны прочитать в массив char. Или просто std :: string, так как это уже работает.