Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 061

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

В Delphi 2010 некорректно отображается кириллица, если символы выводить программно функцией Chr(). Пробовал вроде и в анси, и в юникоде - одно и то же. Причём коды символов правильные.
В Delphi 7 все ок.

Подскажите где грабли?

Заранее спасибо.

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. b: byte;
  4. s: string;
  5. c: char;
  6. begin
  7.  
  8. memo1.Lines.Add(uinttostr(b));
  9. //
  10. s := chr(b);
  11. memo1.Lines.Add(s);
  12. c := chr(b);
  13. memo1.Lines.Add(c);
  14. end;
  15.  


Muratov Radik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 2 марта 2011, 16:02
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 5 марта 2011, 11:30; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 2 марта 2011, 16:05 [#1]:

Проблема в понимании. Дело в том, что chr и ord не являются взаимообратными. В неюникодных делфи это просто совпадало.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 2 марта 2011, 16:08 [#2]:

Попробуй вместо chr() приведение типа
s := Char(b);
memo1.Lines.Add(s);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Muratov Radik

Muratov Radik (статус: Посетитель), 2 марта 2011, 16:14 [#3]:

Вадим К: допустим я не понимаю, объясните плиз?
min@y™: не работает, то же самое выдает
Muratov Radik

Muratov Radik (статус: Посетитель), 2 марта 2011, 16:14 [#4]:

Вадим К: и главное, как добиться цели?
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

Muratov Radik (статус: Посетитель), 2 марта 2011, 16:39 [#7]:

min@y™: с ком-порта приходят названия на русском языке в виде байтов, где каждый байт - это аскии-код русской буквы, я их должен показать юзеру
Вадим К: из указанного выше примера
b := ord('ш');
 memo1.Lines.Add(uinttostr(b));
в memo пишет правильный аскии-код(248).
поэтому и странно, что chr(b) не работает
Muratov Radik

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™

min@y™ (статус: Доктор наук), 2 марта 2011, 16:53 [#10]:

Ну значит надо перекодировать каждый байт в Unicode да и всё. В Delphi2010 должны быть функции на эту тему, но я их не знаю, у меня нету этой версии delphi. Однако, можно за 10 минут наваять свою функцию кодирования и не париться.
Коды букв:
'A' = $0410,
'Я' = $042F,
'а' = $0430,
'я' = $044F.
Проще набросать константный массив, в котором индекс - код буквы в ASCII, а элементы - коды букв в юникоде. И всего делов.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Muratov Radik

Muratov Radik (статус: Посетитель), 2 марта 2011, 16:57 [#11]:

Да, свой перекодировщик будет проще и инвариантен к версии дельфи.
Просто хотел понять, так сказать, природу явления.
Спасибо !
bugmenot

bugmenot (статус: 3-ий класс), 5 марта 2011, 05:32 [#12]:

вообще-то ASCII это #0..#127 не путайте
выше возникает вопрос о кодировке символов которые приходят в виде байт, ага. ну и со всеми вытекающими последствиями.

а также, внезапно, 'А'..'Я','а'..'я' не описывает весь русский алфавит
виконання програми розпочинається з того самого мiсця, де призупинилося.

Muratov Radik

Muratov Radik (статус: Посетитель), 5 марта 2011, 08:23 [#13]:

bugmenot: реплика ниочем
bugmenot

bugmenot (статус: 3-ий класс), 5 марта 2011, 11:30 [#14]:

> bugmenot: реплика ниочем
... но раскрывает природу явления во втором предложении.
"ни о чём" пишется раздельно, кстати
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.03 сек.