std :: string изначально кодируется в UTF-8, но char не может содержать символы utf?

После прочтения 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, "");

1

Решение

В случае std :: string вы читаете одну строку, которая в нашем случае содержит многобайтовый символ Unicode. В случае символа вы читаете один байт, который не является ни одним завершенным символом.

Изменить: для UTF-8 вы должны прочитать в массив char. Или просто std :: string, так как это уже работает.

3

Другие решения


По вопросам рекламы [email protected]