Проблема с русскими символами...

adruha
Offline
Зарегистрирован: 21.05.2013

Вот столкнулся с проблемой не могу понять в чем дело. Хочу перекодировать русские символы для вывода на термопринтер но ничего не получается. Если все делать с английскими символами все в порядке. Подскажите где что не так?

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))]);
          }
  }

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

length считает не количество символов, а количество байт, занимаемых в памяти этой строкой. Для кириллицы это не одно и то же - там каждый знак занимает два байта (для латинских символов - один байт).

http://arduino.ru/forum/programmirovanie/kak-korrektno-podschitat-dlinu-stroki-esli-v-nei-smes-kirillitsy-i-latinitsy

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Во первых кодировка UTF-8 это 2 байта. Во вторых на термопринтере наверно нужно выбрать кодовую страницу. На TM-88IV она в CP866 кодировке.

P.S. Чем изобретать перекодировку я бы предпочел сразу хранить строки в CP866

adruha
Offline
Зарегистрирован: 21.05.2013

Tomasina пишет:

length считает не количество символов, а количество байт, занимаемых в памяти этой строкой. Для кириллицы это не одно и то же - там каждый знак занимает два байта (для латинских символов - один байт).

http://arduino.ru/forum/programmirovanie/kak-korrektno-podschitat-dlinu-stroki-esli-v-nei-smes-kirillitsy-i-latinitsy

я это читал но все же не понял как это реализовать...

adruha
Offline
Зарегистрирован: 21.05.2013

NeiroN пишет:

Во первых кодировка UTF-8 это 2 байта. Во вторых на термопринтере наверно нужно выбрать кодовую страницу. На TM-88IV она в CP866 кодировке.

P.S. Чем изобретать перекодировку я бы предпочел сразу хранить строки в CP866

я не изобретаю, просто незнаю как обратится по другому к шрифту в принтере там он в 866 кодировке, это единственный способ как у меня получилось напечатать русские буквы.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Во первых UTF-8 это не два байта. Один байт для латинских и два для русских символов.

adruha
Offline
Зарегистрирован: 21.05.2013

конструктивных предложений решения данной проблемы не будет?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Используй кодировку CP866 в скетче. Вот модифицированный pde.jar (В настройках есть выбор кодировки строк в исходнике)на версию 1.0.5. Перекодировка происходит при компиляции - хранится оно все также в UTF-8.

Я как то тоже мучался с этим юникодом и понял что проще в самой среде перекодировать чем заставлять делать это микроконтроллер. В итоге скачал исходники и дописал нужный функционал в 1.0.5.

adruha
Offline
Зарегистрирован: 21.05.2013

NeiroN пишет:

Используй кодировку CP866 в скетче. Вот модифицированный pde.jar (В настройках есть выбор кодировки строк в исходнике)на версию 1.0.5. Перекодировка происходит при компиляции - хранится оно все также в UTF-8.

Я как то тоже мучался с этим юникодом и понял что проще в самой среде перекодировать чем заставлять делать это микроконтроллер. В итоге скачал исходники и дописал нужный функционал в 1.0.5.

Да зачем мне эти заморочки, код то рабочий только с русскими буквами не пашет надо понять почему и поправить.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Собственный опыт всегда бесценен. Просто нужно правильно написать - и все заработает. Проблема там в том что почти все библиотеки считают что им дают строки где каждый символ предствлен одним байтом. Изучите как предствлены строки юникода в HEX редакторе - может так будет понятней. откройте скетч в HEX редакторе.

adruha
Offline
Зарегистрирован: 21.05.2013

да какойтам бесценен ... трата времени в пустую и головная боль...