|
Вопрос # 5 061/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
В Delphi 2010 некорректно отображается кириллица, если символы выводить программно функцией Chr(). Пробовал вроде и в анси, и в юникоде - одно и то же. Причём коды символов правильные.
В Delphi 7 все ок.
Подскажите где грабли?
Заранее спасибо.
Приложение: Переключить в обычный режим- procedure TForm1.Button1Click(Sender: TObject);
- var
- b: byte;
- s: string;
- c: char;
- begin
-
- memo1.Lines.Add(uinttostr(b));
- //
- s := chr(b);
- memo1.Lines.Add(s);
- c := chr(b);
- memo1.Lines.Add(c);
- end;
-
 |
Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 2 марта 2011, 16:02
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 14; последнее сообщение — 5 марта 2011, 11:30; участников в обсуждении: 4.
|
Вадим К (статус: Академик), 2 марта 2011, 16:05 [#1]:
Проблема в понимании. Дело в том, что chr и ord не являются взаимообратными. В неюникодных делфи это просто совпадало.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 2 марта 2011, 16:08 [#2]:
Попробуй вместо chr() приведение типа
s := Char(b);
memo1.Lines.Add(s);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Muratov Radik (статус: Посетитель), 2 марта 2011, 16:14 [#3]:
Вадим К: допустим я не понимаю, объясните плиз?
min@y™: не работает, то же самое выдает
|
|
min@y™ (статус: Доктор наук), 2 марта 2011, 16:26 [#5]:
Цитата (Muratov Radik):
не работает, то же самое выдает
Давай колись, зачем тебе такая байда понадобилась?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 2 марта 2011, 16:29 [#6]:
ord смотрит в некое множество, в данном случае множество символов и возвращает порядковый номер в этом множестве. Но так как множество символов совпадает с таблицей аски, то и получаем.
chr преобразовывал по таблице аски.
можете показать, что возвращает ord для какой то русской буквы в 2010 делфи?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Muratov Radik (статус: Посетитель), 2 марта 2011, 16:39 [#7]:
min@y™: с ком-порта приходят названия на русском языке в виде байтов, где каждый байт - это аскии-код русской буквы, я их должен показать юзеру
Вадим К: из указанного выше примера
b := ord('ш');
memo1.Lines.Add(uinttostr(b));
в memo пишет правильный аскии-код(248).
поэтому и странно, что chr(b) не работает
|
|
Muratov Radik (статус: Посетитель), 2 марта 2011, 16:39 [#8]:
min@y™: с ком-порта приходят названия на русском языке в виде байтов, где каждый байт - это аскии-код русской буквы, я их должен показать юзеру
Вадим К: из указанного выше примера
b := ord('ш');
memo1.Lines.Add(uinttostr(b));
в memo пишет правильный аскии-код(248).
поэтому и странно, что chr(b) не работает
|
|
Вадим К (статус: Академик), 2 марта 2011, 16:49 [#9]:
потому что chr пытается подсмотреть в юникод таблице.
Что бы я сделал. Я бы сделал свою таблицу
array[0..255] of char
где бы и вписал правильные символы.
Это будет одинаково хорошо работать в разных делфи.
Для непечатаемых символов можно ввести пробел или точку.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 2 марта 2011, 16:53 [#10]:
Ну значит надо перекодировать каждый байт в Unicode да и всё. В Delphi2010 должны быть функции на эту тему, но я их не знаю, у меня нету этой версии delphi. Однако, можно за 10 минут наваять свою функцию кодирования и не париться.
Коды букв:
'A' = $0410,
'Я' = $042F,
'а' = $0430,
'я' = $044F.
Проще набросать константный массив, в котором индекс - код буквы в ASCII, а элементы - коды букв в юникоде. И всего делов.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Muratov Radik (статус: Посетитель), 2 марта 2011, 16:57 [#11]:
Да, свой перекодировщик будет проще и инвариантен к версии дельфи.
Просто хотел понять, так сказать, природу явления.
Спасибо !
|
|
bugmenot (статус: 3-ий класс), 5 марта 2011, 05:32 [#12]:
вообще-то ASCII это #0..#127 не путайте
выше возникает вопрос о кодировке символов которые приходят в виде байт, ага. ну и со всеми вытекающими последствиями.
а также, внезапно, 'А'..'Я','а'..'я' не описывает весь русский алфавит
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
bugmenot (статус: 3-ий класс), 5 марта 2011, 11:30 [#14]:
> bugmenot: реплика ниочем
... но раскрывает природу явления во втором предложении.
"ни о чём" пишется раздельно, кстати
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|