Delete, Length в Lazarus
Модератор: Модераторы
-
GENI
- новенький
- Сообщения: 12
- Зарегистрирован: 16.11.2008 19:54:30
- Откуда: Arkhangelsk
- Контактная информация:
Delete, Length в Lazarus
Здравствуйте.
Я новичок в FPC/Lazarus.
Почему-то программа написанная в FPC/Lazarus не совсем понятно работает со строками содержащими русский текст.
Так например length при тексте 'Nikita' говорит - 6 символов, при тексте 'Никита' - 12 символов.
Delete вырезает всю строку, вместо части.
Как это понимать?
Стоит FPC 2.2.2, Lazarus 0.9.26 под Windows XP (VirtualBox)
Я новичок в 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
не исключено, что проблемы из-за UTF8
- Alexx2000
- постоялец
- Сообщения: 490
- Зарегистрирован: 25.10.2006 00:22:07
- Откуда: Мытищи
- Контактная информация:
В Lazarus 0.9.26 используется кодировка UTF8. Соответственно каждый символ кириллицы занимает 2 байта.
Чтобы было нормально, используйте функции с префиксом UTF8 (UTF8Length, UTF8Delete и т.д.)
Или перекодировать в Ansi.
Чтобы было нормально, используйте функции с префиксом UTF8 (UTF8Length, UTF8Delete и т.д.)
Или перекодировать в Ansi.
function Utf8ToAnsi(const s : UTF8String) : ansistring;
Не за что.
Чаще нажимай Ctrl+Space. =)
Чаще нажимай Ctrl+Space. =)
функции для работы с UTF8 содержатся в модуле LCLProc
Добавлено спустя 3 минуты 5 секунд:
если хочешь работать со старыми версиями функций преобразуй в Ansi кодировку
Добавлено спустя 2 минуты 36 секунд:
а после преобразуй обратно в UTF8 функцией AnsiToUTF8
кстати для преобразование UTF8<->Ansi ещё есть фукции UTF8ToSys, SysToUTF8, которые делают тоже самое что и выше приведённые...
Добавлено спустя 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, которые делают тоже самое что и выше приведённые...
Кто найдет, имейте в виду, что лучше использовать LazUTF8. LCLProc depricated.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mr.Smart писал(а):кстати для преобразование UTF8<->Ansi ещё есть фукции UTF8ToSys, SysToUTF8, которые делают тоже самое что и выше приведённые...
Если хочешь сохранить здоровье, то лучше избегай их употребления. Они не всегда правильно понимают какая кодировка системная. Соответственно, можно долго думать из-за чего текст вдруг не читаем.
На самом деле, можно использовать http://wiki.freepascal.org/Lazarus_with_FPC3.0_without_UTF-8_mode но лучше просто перевести все проекты на UTF-8. Мне кажется, это в дальнейшем (при интернационализации) избавит от головной боли.
Комрады, вы что, 10 лет были в коме? 
