Александр Яшин писал(а):Так компилируется, но в Symbol нечитаемый символ!
Без примера тут будет проблематично разобраться. «Читаемый» и «нечитаемый» — понятия относительные, зависят от того как выводить, куда выводить и под какой ОС всё это происходит. Если выводить на форму — то для читабельности нужно его преобразовывать обратно в UTF-8 вне зависимости от платформы, в консоль под Linux — тоже чаще всего в UTF-8, в в консоль под Windows — в кодировку OEM Cyrillic (866).
Александр Яшин писал(а):Похоже тип char в Unicode поддерживается только для кодов < 128
Тип char и Unicode — это две разные вещи. Char — это кусочек памяти размером ровно в один байт. Юникод — это способ кодирования символов, его конкретная разновидность, UTF-8, требует от одного до четырёх байт памяти на один символ. По одному байту — на символы латиницы, для совместимости, на кириллицу — по два, на восточные кодировки — 3 и 4 байта. Разумеется, что любой символ UTF-8 не влезет в один байт переменной типа char. Это всё равно что переливать воду из четырёхлитрового бочонка в литровую банку. Если в бочонке было меньше литра (читай «< 128») — наше счастье, но полагаться на это никоим образом нельзя.
И кстати, можете заглянуть в исходники и посмотреть, что такое TUTF8Char Ctrl+щелчок мышкой на типе переменной.
- Код: Выделить всё
TUTF8Char = String[7];
Символьные типы данных
В Lazarus имеется символьный тип Char. Переменная такого типа занимает ровно один байт памяти и может содержать любой ASCII — символ. Русскому языку с этим типом не повезло — поскольку символы кириллицы занимают по 2 байта, использовать этот тип с русскими буквами нельзя. Давайте откроем Lazarus с новым проектом. Если Lazarus у вас уже загружен, закройте старый проект командой Файл -> Закрыть, и создайте новый проект командой Проект -> Создать проект -> Приложение. Сразу же сохраните проект в папку 05-01 там, где вы храните все проекты лекций, проекту дайте имя MyStrings, и не забудьте назвать модуль главной формы Main, а саму форму fMain. Пусть это войдет у вас в привычку. Как всё это делается, вы должны знать по предыдущим лекциям. Не вздумайте давать своим проектам имена, используя ключевые (зарезервированные) слова.
Например, нельзя давать проекту или модулю имя Strings, поскольку это слово зарезервировано, но MyStrings можно.
Прямо посреди формы установите кнопку TButton, дважды нажмите на нее, чтобы сгенерировать обработчик OnClick. В обработчике создадим раздел переменных var, укажем там одну переменную типа Char, и запрограммируем следующий код:
procedure TfMain.Button1Click(Sender: TObject); var ch1: Char; //переменная символьного типа begin ch1:= 'Z'; ShowMessage(ch1); end;
Как видим, здесь мы переменной ch1 присвоили значение — символ «Z«. Запомните правило:
Символы и строки в Lazarus должны быть заключены в одинарные кавычки. Если требуется ввести в текст одинарную кавычку (например, в слове can’t), то следует указать две таких одинарных кавычки, которые также заключены в одинарные кавычки.
Например:
Mystring:= 'I can' + '''' + 't';
Этот пример выполнять не нужно, он просто демонстрирует использование кавычек в строковых выражениях, и возможность в выражении соединять несколько строк в одну с помощью знака «+«. Однако вернемся к нашему проекту. После того, как мы присвоили символьной переменной большую английскую букву «Z», мы вывели содержимое переменной с помощью строки
Сохраните проект, скомпилируйте его и выполните. Когда программа с кнопкой появится на экране, нажмите нашу единственную кнопку — выйдет сообщение с буквой «Z»:
Рис.
5.2.
Вывод символа
Таким образом, мы можем работать с отдельными символами. Однако если вы исправите код, и вместо буквы «Z» в строке
укажете русский символ, то при попытке скомпилировать и запустить проект выйдет ошибка «Error: Incompatible types: got «Constant String» expected «Char»» — несовместимость типов String (строка) и Char (символ). Поскольку русские буквы занимают по два байта, Lazarus их считает строкой символов. Однако это не значит, что мы совсем не имеем возможности работать с отдельными символами кириллицы.
Ранее упоминалось, что в Lazarus используется формат UTF8. Для поддержки этого формата были разработаны расширенные типы данных, в том числе и символьные. Так, имеется тип TUTF8Char, который позволяет работать с любыми отдельными символами, в том числе и русскими. Имеет смысл всегда использовать его вместо стандартного Char. Но для этого нам нужно будет подключить модуль LCLType, где этот тип описан.
Перейдите в редактор кода и пролистайте код модуля вверх. Там вы увидите раздел uses (англ. use — использовать), где перечислены подключенные модули. Нам нужно поставить после последнего модуля запятую и добавить наш подключаемый модуль:
uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType;
Если строка получается длинной, то после запятой можно переносить текст на другую строку.
Теперь вернемся к обработчику нажатия на кнопку и переделаем его:
procedure TfMain.Button1Click(Sender: TObject); var ch1: Char; ch2: TUTF8Char; begin ch1:= 'Z'; ch2:= 'Я'; ShowMessage(ch1); ShowMessage(ch2); end;
Теперь всё сработает как надо, и русский символ «Я» выйдет так же, как английский «Z«.
Однако, это еще не всё. Символы можно вводить, указывая их номер в таблице символов. Для этого перед номером нужно указать символ «#«, например:
Под номером 90 находится буква Z в таблице символов, так что результат не изменится. Также в строковых выражениях можно указывать и специальные символы. Например, символ под номером 13 — это символ перехода на другую строку. Давайте снова немного изменим код:
procedure TfMain.Button1Click(Sender: TObject); var ch1: Char; ch2: TUTF8Char; begin ch1:= #90; //буква Z ch2:= 'Я'; ShowMessage(ch1 + #13 + ch2); //вывод двухстрочного сообщения end;
Сохраните проект, скомпилируйте и запустите на выполнение. Теперь содержимое двух символьных переменных выходит в одном сообщении, но каждое на своей строке.
Topic: Char constant (Read 1236 times)
There is a declaration
CONST hor=’Ä’;
and later
FillChar(zo[1], z_breite, hor);
Compilermessage: Error: Incompatible type for arg no. 3: Got «Constant String», expected «Char»
Why is CONST hor=’Ä’; not a constant for a character but for a string??
Logged
« Last Edit: February 16, 2021, 07:04:47 pm by Handoko »
Logged
Thank you,
you are right.
If i replace hor=’Ä’ by hor=’A’ the error does not occur.
I need these characters for graphic symbols.
Logged
[…] Why is CONST hor=’Ä’; not a constant for a character but for a string??
That is an encoding issue. You have probably saved your file in UTF-8. When you
writeLn(sizeOf(hor))
you will see this is two Bytes, but a
char
is a 1-Byte-sized quantity. If I save your code (for example) as a “Latin-1” encoded file, it will compile without issues.
Alternatively, you may specify
{$mode DelphiUnicode}
before
program
. This will make
char
values occupy two Bytes.
Or, what Handoko suggested. That’s probably the easiest method.
Logged
Logged
If you use Lazarus IDE, then by default everything you type is in UTF8 encoding.
‘Ä’ in UTF8 consist of more than 1 byte (2, I guess), so from the point of the compiler it is a string.
If you use the FP IDE then ‘Ä’ is stored as a single byte, so the compiler can treat it as a Char.
Solutions rahter depend on wether this is a console application or a GUI application and wether or not you use the Lazarus IDE as your editor or the FP IDE (or Notepad or something else).
Bart
Logged
Hi!
Ä Ansi $C4 1 Byte
Ä Utf-8 $C384 2 Bytes
Winni
Logged
Deniseo 2 / 2 / 1 Регистрация: 23.04.2015 Сообщений: 56 |
||||||||
1 |
||||||||
Преобразование определенных букв из прописных в строчные25.03.2016, 19:46. Показов 2731. Ответов 10 Метки нет (Все метки)
Задача: Составить программу, которая преобразует буквы «А», «Б», «В» из прописных букв в строчные. У меня получилось только это:
Как сделать программу надлежащим образом, как сказано в задачи? Добавлено через 29 минут
__________________
0 |
Пытливый 3295 / 1977 / 635 Регистрация: 29.05.2013 Сообщений: 8,553 |
||||
25.03.2016, 19:50 |
2 |
|||
Простейший вариант:
… и т.д.
0 |
quwy Native x86 5175 / 3022 / 874 Регистрация: 13.02.2013 Сообщений: 9,635 |
||||
25.03.2016, 19:51 |
3 |
|||
0 |
Deniseo 2 / 2 / 1 Регистрация: 23.04.2015 Сообщений: 56 |
||||||||
25.03.2016, 20:03 [ТС] |
4 |
|||||||
Моя методичка не знает что такое «StringReplace» и «rfReplaceAll»(да и сам я не знаю что это вообще) ( Взято из методичке)Можно ли реализовать по этим процедурам и функциям? Добавлено через 1 минуту
Ошибка
0 |
quwy Native x86 5175 / 3022 / 874 Регистрация: 13.02.2013 Сообщений: 9,635 |
||||
25.03.2016, 20:05 |
5 |
|||
Процедуры: Delete, Insert, Str, Val Обязательно использовать их все? Добавлено через 24 секунды
unit1.pas(51,8) Error: Identifier not found «CharInSet» Уточняйте в следующий раз версию Delphi.
0 |
Deniseo 2 / 2 / 1 Регистрация: 23.04.2015 Сообщений: 56 |
||||||||||||
25.03.2016, 20:20 [ТС] |
6 |
|||||||||||
Обязательно использовать их все? Добавлено через 24 секунды Уточняйте в следующий раз версию Delphi.
Не обязательно, но нужно как то это реализовать по процедурам и функциям которые указаны методичке. Кстати, ошибка осталась, только уже другая
Добавлено через 4 минуты
Добавлено через 6 минут
0 |
unifikator 500 / 356 / 231 Регистрация: 29.03.2015 Сообщений: 675 |
||||
25.03.2016, 20:28 |
7 |
|||
Код:
0 |
Deniseo 2 / 2 / 1 Регистрация: 23.04.2015 Сообщений: 56 |
||||||||
25.03.2016, 20:31 [ТС] |
8 |
|||||||
Код:
Может в вашем delphi работает, но в моем лазарусе не хочет
Начинает ругаться с 9 строчки вашего кода
0 |
500 / 356 / 231 Регистрация: 29.03.2015 Сообщений: 675 |
|
25.03.2016, 20:38 |
9 |
Мой код работает в Delphi 6. Правильно, что пересоздали тему в разделе «Форум Lazarus».
0 |
volvo Супер-модератор 32451 / 20945 / 8105 Регистрация: 22.10.2011 Сообщений: 36,213 Записей в блоге: 7 |
||||
25.03.2016, 21:39 |
10 |
|||
Решение
Может в вашем delphi работает Это работает в Лазарусе:
1 |
2 / 2 / 1 Регистрация: 23.04.2015 Сообщений: 56 |
|
25.03.2016, 21:51 [ТС] |
11 |
Благодарю вас хороший человек
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
25.03.2016, 21:51 |
Помогаю со студенческими работами здесь
Преобразовать строку, заменив все вхождения прописных букв,на строчные Получить файл g, образованный из файла f заменой всех его прописных (больших) букв на строчные (малые) Подсчитать, сколько было введено: латинских прописных букв, кириллических прописных букв, цифр, знаков переноса, прочих символов. Подсчёт количества прописных и строчных букв и преобразование строки
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 11 |