Проблема с русскими символами...
- Войдите на сайт для отправки комментариев
Пт, 07/03/2014 - 21:55
Вот столкнулся с проблемой не могу понять в чем дело. Хочу перекодировать русские символы для вывода на термопринтер но ничего не получается. Если все делать с английскими символами все в порядке. Подскажите где что не так?
String unicode[] = {"\200","\201","\202","\203","\204","\205","\206","\207","\210","\211","\212","\213","\214","\215","\216","\217","\220","\221","\222","\223","\224","\225","\226","\227","\230","\231","\232","\233","\234","\235","\236","\237","\240","\241","\242","\243","\244","\245","\246","\247","\250","\251","\252","\253","\254","\255","\256","\257","\260","\261","\262","\263","\264","\265","\266","\267","\270","\271","\272","\273","\274","\275","\276","\277"}; //String rp = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"; String rp = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"; String ru = "ардуино"; //String ru = "arduino"; int l=rp.length(); int n=ru.length(); printer.begin(60); for(int d=0;d<n;d++){ if(rp.indexOf(ru.charAt(d))>=0){ //printer.println(unicode[rp.indexOf(ru.charAt(d))]); } }
length считает не количество символов, а количество байт, занимаемых в памяти этой строкой. Для кириллицы это не одно и то же - там каждый знак занимает два байта (для латинских символов - один байт).
http://arduino.ru/forum/programmirovanie/kak-korrektno-podschitat-dlinu-stroki-esli-v-nei-smes-kirillitsy-i-latinitsy
Во первых кодировка UTF-8 это 2 байта. Во вторых на термопринтере наверно нужно выбрать кодовую страницу. На TM-88IV она в CP866 кодировке.
P.S. Чем изобретать перекодировку я бы предпочел сразу хранить строки в CP866
length считает не количество символов, а количество байт, занимаемых в памяти этой строкой. Для кириллицы это не одно и то же - там каждый знак занимает два байта (для латинских символов - один байт).
http://arduino.ru/forum/programmirovanie/kak-korrektno-podschitat-dlinu-stroki-esli-v-nei-smes-kirillitsy-i-latinitsy
я это читал но все же не понял как это реализовать...
Во первых кодировка UTF-8 это 2 байта. Во вторых на термопринтере наверно нужно выбрать кодовую страницу. На TM-88IV она в CP866 кодировке.
P.S. Чем изобретать перекодировку я бы предпочел сразу хранить строки в CP866
я не изобретаю, просто незнаю как обратится по другому к шрифту в принтере там он в 866 кодировке, это единственный способ как у меня получилось напечатать русские буквы.
Во первых UTF-8 это не два байта. Один байт для латинских и два для русских символов.
конструктивных предложений решения данной проблемы не будет?
Используй кодировку CP866 в скетче. Вот модифицированный pde.jar (В настройках есть выбор кодировки строк в исходнике)на версию 1.0.5. Перекодировка происходит при компиляции - хранится оно все также в UTF-8.
Я как то тоже мучался с этим юникодом и понял что проще в самой среде перекодировать чем заставлять делать это микроконтроллер. В итоге скачал исходники и дописал нужный функционал в 1.0.5.
Используй кодировку CP866 в скетче. Вот модифицированный pde.jar (В настройках есть выбор кодировки строк в исходнике)на версию 1.0.5. Перекодировка происходит при компиляции - хранится оно все также в UTF-8.
Я как то тоже мучался с этим юникодом и понял что проще в самой среде перекодировать чем заставлять делать это микроконтроллер. В итоге скачал исходники и дописал нужный функционал в 1.0.5.
Да зачем мне эти заморочки, код то рабочий только с русскими буквами не пашет надо понять почему и поправить.
Собственный опыт всегда бесценен. Просто нужно правильно написать - и все заработает. Проблема там в том что почти все библиотеки считают что им дают строки где каждый символ предствлен одним байтом. Изучите как предствлены строки юникода в HEX редакторе - может так будет понятней. откройте скетч в HEX редакторе.
да какойтам бесценен ... трата времени в пустую и головная боль...