Код символа

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

bogdan
новенький
Сообщения: 40
Зарегистрирован: 20.05.2015 20:32:49

Код символа

Сообщение bogdan »

Здравствуйте! Как в Lazarus для кириллицы вернуть ASCII код символа, например буква "Т" по таблице 210, а в лазарусе 208 и 162?

Код: Выделить всё

lcName1 := 'Т';
showmessage(lcName1 + ' ' +IntToStr(Ord(lcName1[1])) + ' ' + IntToStr(Ord(lcName1[2])));
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

а вы уверены что в данном варианте у вас ASCII?
По идее у вас ютф8...
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

bogdan
Я б делал вручную для каждой буквы алфавита.

Код: Выделить всё

program Project1;

uses
  Classes, SysUtils, LazUtf8, Windows, Messages, Dialogs;

var
  p: PChar;

function Utf8CharToASCII(const p: PChar): integer;
  begin
    if p = 'Т' then Result := 210; // Т
    // и т.д. весь алфавит
  end;

begin
  p := 'Т';
  WriteLn(IntToStr(Utf8CharToASCII(p)));
  Readln;
end.     


Добавлено спустя 8 минут 33 секунды:
bogdan писал(а):а в лазарусе 208 и 162

Лазарус работает на Юникоде
В двоичном виде будут:
11010000 и 10100010
Символ с кодом до 2048 кодируется 2-мя байтами.
Берем от первого последние 5 бит, а от второго последние 6 бит и получаем:
10000100010 = 1058 = $0422
Кириллица в Юникоде
Для "Т" Юникод = $0422 (= 1058).
MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

Не совсем понятен вопрос. Следует помнить, что в исходном pas строковые константы которые ты набираешь сохраняются в utf8. Надо четко понимать из какой кодировки и куда ты хочешь перевести. Системная кодировка называется ANSI, если у тебя русская винда, то ANSI = cp1251, кириллица то бишь, если линукс к примеру, то utf8 скорее всего. Есть 2 функции AnsiToUtf8 и Utf8ToAnsi. Ими и пользуйся)
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Кто говорил про строки, про константы, про системные кодировки? Надо четко читать условие: есть символ - нужен код ASCII. Всё.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

я намекал на:

Код: Выделить всё

uses
  LConvEncoding;
......
lcName1 := UTF8ToCP1251('Т');
showmessage(lcName1 + ' ' +IntToStr(Ord(lcName1[1])) + ' ' + IntToStr(Ord(lcName1[2])));


п.с.

Код: Выделить всё

if p = 'Т' then Result := 210; // Т
Это вы ему предлагаете всю таблицу "запихнуть"? А надо ли?

AnsiToUtf8 и Utf8ToAnsi
это дело то работает... то нет...
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Подтверждаю, работает UTF8ToCP1251
program Project1;

uses
Classes, SysUtils, LazUtf8, Windows, Messages, Dialogs,LConvEncoding;

var
p: PChar;

begin
p := 'Т';
WriteLn(IntToStr(Integer(UTF8ToCP1251(p)[1])));
Readln;
end.
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

Пример моего любимого кода :)

Код: Выделить всё

Function GetCode(c : char) : byte;
Var
  a : byte absolute c;
begin
  GetCode := a;
end;
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Шайтанама :mrgreen:
Только у меня не получается прикрутить этот код к кириллице.
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

А какая кодовая таблица? 866 или 1251?
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

PapaNT в редакторе кода, без "принуждения" ютф8....
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

интересно... зачем тогда нужно событие OnUTF8KeyPress

Добавлено спустя 5 минут 15 секунд:
причем, судя по всему, различие между ними в величине "символа".
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Лекс Айрин писал(а):интересно...

Как набирать символы с помощью кнопки Alt
А как же твой редактор будет обрабатывать коды, большие 7(8) бит?
К примеру, нажал клавишу Alt и набираешь комбинацию 777 на цифровой клавиатуре. Получается символ ○.
Последний раз редактировалось resident 04.06.2016 16:54:52, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

resident писал(а):А как же твой редактор будет обрабатывать коды, большие 7(8) бит?


Лично у меня он набирает их даже без дополнительного кода. И не забывай, что скан-код символа и символ это разные сущности.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Лекс Айрин писал(а):Лично у меня он набирает их даже без дополнительного кода

Ок. Тогда даже не знаю зачем этот обработчик.

Добавлено спустя 5 минут 30 секунд:
А если его использовать, чтобы он на лету заменял, например, кириллицу на транслитерацию?
Ответить