Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Madsson
0 / 0 / 0
Регистрация: 10.06.2016
Сообщений: 2
#1

Печать на русском. Принтер CUSTOM TG2480H (VS2013) - C++

14.06.2016, 10:13. Просмотров 995. Ответов 3
Метки нет (Все метки)

Всем привет! Нужна ваша помощь

Уже 4 дня как я пытаюсь напечатать текст на русском языке но все четно.
В принтере используется протокол ESC/POS. Работает через компорт. С горем пополам я нашел класс-обвертку для компорта и научился отправлять команды. И все бы хорошо, но как только дело дошло до русского языка - работа встала. Перечитав протокол я наткнулся на команду "Set charecter code table", что дает возможность выбирать кодировки в самом принтере для правильного отображения языков. Одним из параметров была кодировка РС866, которая и указывает на кириллицу. При подключении этой кодировки должен был заработать русский, но на печати снова появились кракозяблики. Открыв таблицу СР866 я увидел, что эти кракозяблики являются частью таблицы. Взяв коды букв из этой таблицы и отправив их на печать я все таки получил русский язык. А если взять и сравнить коды, например букв 'A', то разница между ними будет - 64. (код 'A' С++ = 192, 'A'CP866 = 128). Интересно то, что при использовании кодировки СР866 для консоли (setConsoleCP, setConsoleCPOut) отображается нормальный русский текст, а при выводе на принтер получаем кракозяблики.

Подскажите, может нужно как-то еще обработать текст? Почему кодировки не совпадают?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2016, 10:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Печать на русском. Принтер CUSTOM TG2480H (VS2013) (C++):

Печать из консоли на принтер - C++
Здравствуйте столкнулся с такой проблемой как печать с консольного окна результата программы. Хотел сделать следующее сам код...

Печать на USB принтер в Win XP из консольного приложения С++ Win32? - C++
Возможно ли из консольного приложения Win32 (без CLR, Unicode и пр.) в Visual C++ 2010 организовать печать на USB принтер? #if MSDOS ...

Принтер, печать - Delphi
Здравствуйте ув. форумчане! Думаю что с веткой форума не ошибся. Нужно написать программу которая будет мониторить ошибки поступающие от...

Печать на принтер - Delphi
Как узнать на какой принтер пошла печать

Печать на принтер и в файл - Visual Basic .NET
1) Как в VB.NET вывести на печать (на принтер, я имею ввиду) 'Hello'? 2) Как в VB.NET вывести в файл на диск 'Hello'? 3) Как в VB.NET...

Печать на определенный принтер - Delphi
Добрый день уважаемые форумчане. Полазил по форуму, но ответа не нашел на свой вопрос. Имеется принтер этикеток TSC TTP-245C,...

3
avgoor
965 / 599 / 130
Регистрация: 05.12.2015
Сообщений: 1,682
14.06.2016, 13:56 #2
Цитата Сообщение от Madsson Посмотреть сообщение
Подскажите, может нужно как-то еще обработать текст?
А кодировка сpp файла какая? Попробуйте вывести строку с четко заданными символами: char str[] = "\x95\xE3\xA9!";
0
Madsson
0 / 0 / 0
Регистрация: 10.06.2016
Сообщений: 2
14.06.2016, 14:16  [ТС] #3
В общем разобрался немного. Если текст вводить в VS то он автоматически кодируется 1251 (char* text = "Тестовый текст для печати" - 1251). Соответственно, консоль(866) выводит текст в кракозяблики, что делает и принтер. Т.е. для корректной печати мне осталось перевести 1251 в 866. Но задача усложняется тем, что текст берется из файла который должен быть в кодировке UTF-8. Т.е. нужно конвектировать UTF-8 в СР866. Подскажите, как правильно это сделать. Инфо на форуме до этого не совсем понятна и разнобойна. Если можно, небольшой пример.
0
avgoor
965 / 599 / 130
Регистрация: 05.12.2015
Сообщений: 1,682
14.06.2016, 14:54 #4
Цитата Сообщение от Madsson Посмотреть сообщение
Если можно, небольшой пример.
C++
1
2
3
4
5
6
7
    std::string string_in_u8 = u8"Какой-то текст";
 
    typedef std::codecvt<wchar_t, char, mbstate_t> codec;
    std::wstring w = std::wstring_convert<codec>(new std::codecvt_utf8<wchar_t>).from_bytes(string_in_u8);
    std::string string_in_cp866 = std::wstring_convert<codec>(new std::codecvt_byname<wchar_t, char, mbstate_t>(".866")).to_bytes(w);
 
    std::cout << string_in_cp866;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2016, 14:54
Привет! Вот еще темы с ответами:

Принтер и пищевая печать - Принтеры, МФУ
Доброго времени суток! Хотим открыть мини-производство печенья с предсказаниями. Открываешь печеньку, а внутри нее записка с...

QTableWidget печать на принтер - C++ Qt
Привет всем) У меня имеетcя большая таблица, которая расположена в QTableWidget. У неё ширина больше, чем у формата A4. Как его не...

Печать через принтер - C++ Builder
Возникла такая проблема - огромный рисунок нужно разбить на страницы и распечатать - рисунок в TImage - использую TPrinter - все...

1C 7.x С 1С не идет печать на принтер - 1С
Всем привет!!! У меня такая проблема::( В конторе есть сеть из 8 компов. В соседнем кабинете стоит сервер(Server2003),где установлена...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru