Forum > Russian

Некорректно копирует символы из TMemo. Incorrectly copies characters from TMemo

(1/2) > >>

Leonid:
Добрый день!
Не получается корректно скопировать символ из TMemo в Lazarus 2.0.8.
Начать решил с простого, разместил на форме Memo1, Memo2, Button1 и написал следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    S:string;
begin
  i:=0;
  S:=copy(Memo1.Lines.strings,1,1);
  Memo2.Lines.Add(S);
end;

Однако при запуске программы, если ввожу в Memo1 любые несколько русских букв (Russian letter), например "абв", нажимаю Button1, то в Memo2 появляется "?".
При этом, если ввожу в Memo1 любые несколько цифр, например "123", или несколько любых английских символов, например "abc", то в Memo2 появится "1" или "a" соответственно (т.е. все корректно).
Если в программном коде поменяю на:
S:=copy(Memo1.Lines.strings,1,2);
то в Memo2 будет появляться два числа или латинских символа, а русская буква одна.
Это ошибка или я что-то не так делаю?
Сравнивал с delphi7, там такого нет.

skalogryz:
LCL кодировка это UTF8.
Огрубляя - все английские буквы это 1 символ в string, все русские буквы это 2 символа.

Если тебе нужно скопировать выбранный в TMemo текст, что проще использовать свойство SelText.

Если тебе нужно скопировать произвольный текст из TMemo, то придёться парсить UTF8 символы

Самый простой для тебя вариант это добавить модуль LazUTF8 и вызывать UTF8Copy.
она как-раз занимается парсингом utf8

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---uses ...  LazUTF8;...procedure TForm1.Button1Click(Sender: TObject);var i:integer;    S:string;begin  i:=0;  S:=UTF8copy(Memo1.Lines.strings,1,1);  Memo2.Lines.Add(S);end;

Leonid:
Получилось, спасибо большое!

Zeno:
А как скопировать один русский символ из строки типа String в переменную типа Char? У переменной типа string есть свойство Chars, дающее доступ к строке как массиву символов, но оно не обрабатывает русские символы корректно.

skalogryz:

--- Quote from: Zeno on September 29, 2020, 02:04:02 am ---А как скопировать один русский символ из строки типа String в переменную типа Char? У переменной типа string есть свойство Chars, дающее доступ к строке как массиву символов, но оно не обрабатывает русские символы корректно.

--- End quote ---
два пути:
1) следует использовать тип UTF8Char (который по сути есть строка)
2) (delphi-образный) конверитовать String в WideString (или UnicodeString), и использовать WideChar (или UnicodeChar) вместо Char.

Navigation

[0] Message Index

[#] Next page

Go to full version