Delete, Length в Lazarus

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

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

Ответить
GENI
новенький
Сообщения: 12
Зарегистрирован: 16.11.2008 19:54:30
Откуда: Arkhangelsk
Контактная информация:

Delete, Length в Lazarus

Сообщение GENI »

Здравствуйте.
Я новичок в FPC/Lazarus.
Почему-то программа написанная в FPC/Lazarus не совсем понятно работает со строками содержащими русский текст.
Так например length при тексте 'Nikita' говорит - 6 символов, при тексте 'Никита' - 12 символов.
Delete вырезает всю строку, вместо части.
Как это понимать?
Стоит FPC 2.2.2, Lazarus 0.9.26 под Windows XP (VirtualBox)
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

не исключено, что проблемы из-за UTF8
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

В Lazarus 0.9.26 используется кодировка UTF8. Соответственно каждый символ кириллицы занимает 2 байта.
Чтобы было нормально, используйте функции с префиксом UTF8 (UTF8Length, UTF8Delete и т.д.)
Или перекодировать в Ansi.
GENI
новенький
Сообщения: 12
Зарегистрирован: 16.11.2008 19:54:30
Откуда: Arkhangelsk
Контактная информация:

Сообщение GENI »

А как перекодировать в ansi?
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

function Utf8ToAnsi(const s : UTF8String) : ansistring;
GENI
новенький
Сообщения: 12
Зарегистрирован: 16.11.2008 19:54:30
Откуда: Arkhangelsk
Контактная информация:

Сообщение GENI »

Спасибо люди.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Не за что.
Чаще нажимай Ctrl+Space. =)
GENI
новенький
Сообщения: 12
Зарегистрирован: 16.11.2008 19:54:30
Откуда: Arkhangelsk
Контактная информация:

Сообщение GENI »

А не помогает str1=Utf8ToAnsi(str1); Симптомы теже.
UTF8Length нет такого пишет.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

функции для работы с UTF8 содержатся в модуле LCLProc

Добавлено спустя 3 минуты 5 секунд:
если хочешь работать со старыми версиями функций преобразуй в Ansi кодировку

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

var
 s: String;
...
begin
   s:=UTF8ToAnsi(<строка>);
   if Length(s)>10 then
    Delete(s,10,Length(s));
...
end;


Добавлено спустя 2 минуты 36 секунд:
а после преобразуй обратно в UTF8 функцией AnsiToUTF8
кстати для преобразование UTF8<->Ansi ещё есть фукции UTF8ToSys, SysToUTF8, которые делают тоже самое что и выше приведённые...
GENI
новенький
Сообщения: 12
Зарегистрирован: 16.11.2008 19:54:30
Откуда: Arkhangelsk
Контактная информация:

Сообщение GENI »

Вот, теперь все работает. Я что-то не подумал, что надо обратно преобразовывать.
Makhaon
новенький
Сообщения: 38
Зарегистрирован: 08.08.2018 14:23:24

Сообщение Makhaon »

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

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

Mr.Smart писал(а):кстати для преобразование UTF8<->Ansi ещё есть фукции UTF8ToSys, SysToUTF8, которые делают тоже самое что и выше приведённые...


Если хочешь сохранить здоровье, то лучше избегай их употребления. Они не всегда правильно понимают какая кодировка системная. Соответственно, можно долго думать из-за чего текст вдруг не читаем.
Python
новенький
Сообщения: 20
Зарегистрирован: 23.01.2018 20:50:17

Сообщение Python »

На самом деле, можно использовать http://wiki.freepascal.org/Lazarus_with_FPC3.0_without_UTF-8_mode но лучше просто перевести все проекты на UTF-8. Мне кажется, это в дальнейшем (при интернационализации) избавит от головной боли.
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Комрады, вы что, 10 лет были в коме? :)
Ответить