Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

Как перегрузить оператор << у cout?

#операторы #перекодировка #cpp #библиотеки


В связи с этим вопросом решил задать другой, как оказалось, более важный вопрос.
В общем я недавно начал изучать C++ и поимел проблемы с кодировками, помогите мне
перегрузить << у std::cout чтобы он принимал строки в utf-8 а выводил в windows-866. 
    


Ответы

Ответ 1



Собственно, перегрузить сможете, только если будете передавать какой-то тип, отличный от string, char* и пр., поскольку << у cout уже перегружен для них. Можно просто создать функцию с такой вот примерно сигнатурой void printunicode (ostream&, const string&) В ней собственно переводите юникодное содержимое строки в нужную кодировку, записываете его в буфер, а его уже передаете потоку. Или даже проще. Создаете функцию, которая принимает строку с юникодом, а возвращает в нужной кодировке. Тогда можете ее использовать в череде операторов <<.

Ответ 2



Помню как заминусовали когда в прошлый раз ответил на свой вопрос но всё таки отвечу :) Понял что легче всего сменить кодировку файла на целевую (хорошо что я не японец :) ). В общем для Code::Blocks сделал так: 1) Скачал uniconv.exe (давно качал счас не помню где) 1a) Т.к. uniconv не поддерживает utf-8 поставил по умолчанию в code::blocks windows-1251 2) Добавил в Tools такой Tool: 3) И если работаю с D:\ProjectsC++\C++ Learning\Chapter 2\Homework\Ch2_Ex1.cpp: #include int main(){ using namespace std; cout << "Привет! " << endl << "Моё имя: Иван." << endl << "Моя фамилия: Черновалов."; cin.get(); return 0; } и вызываю tools=>reCHARSET WD то получаю D:\ProjectsC++\C++ Learning\Chapter 2\Homework\Ch2_Ex1.cpp.cpp в windows 866 затем вручную :( открываю его и вижу: #include int main(){ using namespace std; cout << "ЏаЁўҐв! " << endl << "Њ®с Ё¬п: €ў ­." << endl << "Њ®п д ¬Ё«Ёп: —Ґа­®ў «®ў."; cin.get(); return 0; } 4) Строю&Запускаю и ву-аля: Может кому поможет... PS: Как видите не могу получить (не создав Project) отдельно имя файла отдельно директорию поэтому приходится использовать двойное расширение чтобы отличать файлы (т.к ели изменять редактируемый файл то ошибка приложения) и приходится вручную открывать файл. Ещё в code::blocks есть Tools+ и Scripts но я не умею ими пользоваться если кто может помогите усовершенствовать мой "костыль" :) чтобы создавался временный файл компилировался с именем текущего и удалялся...

Комментариев нет:

Отправить комментарий