Вопросы программирования на Free Pascal, использования компилятора и утилит.
Модератор: Модераторы
Ism
энтузиаст
Сообщения: 908 Зарегистрирован: 06.04.2007 17:36:08
Сообщение
Ism » 12.06.2011 00:13:54
Привет,
столкнулся с проблемой, не работает UpperCase для UTF8
Код: Выделить всё
Edit1.Text:=UpperCase('л'); Edit2.Text:=LowerCase('Л');возвращает ту же букву не преобразовывая в верхний или нижний регистр
это глюк или я чтото не так сделал ?
Lazarus 0.9.30
Добавлено спустя 6 минут 28 секунд: возвращает вообще ?
Mr.Smart
долгожитель
Сообщения: 1796 Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!
Сообщение
Mr.Smart » 12.06.2011 00:47:56
Это нормально. Данные функции работают с Ansi кодировкой.
Ism писал(а): возвращает вообще ?
Что за ОС?
Добавлено спустя 3 минуты 38 секунд: С тормозил. Как данная функция должна, что-то вернуть, если кодировка у вас UTF-8.
Используйте следующую конструкцию
Код: Выделить всё
Edit1.Text:=UTF8Encode(WideUpperCase(UTF8Decode('л')));
Ism
энтузиаст
Сообщения: 908 Зарегистрирован: 06.04.2007 17:36:08
Сообщение
Ism » 12.06.2011 01:00:58
Windows 7
прикол в том, что здесь говорится, что
http://lazarus-ccr.sourceforge.net/docs ... rcase.html Код: Выделить всё
function UpperCase( const s: String ):String;А так как String по умолчанию в freepascal UTF8 , то функция должна работать
Добавлено спустя 9 минут 3 секунды: также AnsiStrIComp почемуто для русских символов регистрозависима
Odyssey
энтузиаст
Сообщения: 580 Зарегистрирован: 29.11.2007 16:32:24
Сообщение
Odyssey » 12.06.2011 01:58:29
Ism писал(а): А так как String по умолчанию в freepascal UTF8
Это не так. String кодируется в utf-8 только в Lazarus LCL. Библиотеки Free Pascal - RTL и FCL - работают со строками в системной однобайтной кодировке, либо в ASCII. Поэтому для работы с utf-8 приходится пользоваться функциями из LCL, которые в основном находятся в модуле LCLProc. Одна из таких функций - Utf8UpperCase.
Там же, чуть дальше, пишут:
only ASCII codes below 127 are converted
Ism
энтузиаст
Сообщения: 908 Зарегистрирован: 06.04.2007 17:36:08
Сообщение
Ism » 12.06.2011 02:37:33
ой не посмотрел
использовал вариант Mr.Smart
Код: Выделить всё
Edit1.Text:=UTF8Encode(WideUpperCase(UTF8Decode('л')))Он более универсален
rayanAyar
новенький
Сообщения: 42 Зарегистрирован: 06.01.2011 07:22:52
Откуда: Новоуральск
Сообщение
rayanAyar » 12.06.2011 05:30:10
Ism писал(а): Код: Выделить всё
Edit1.Text:=UTF8Encode(WideUpperCase(UTF8Decode('л')))Если строка изначальнов UTF8, то можно и сразу сделать, без двойного преобразования:
Ism
энтузиаст
Сообщения: 908 Зарегистрирован: 06.04.2007 17:36:08
Сообщение
Ism » 12.06.2011 18:44:10
Edit1.Text:=UTF8UpperCase('л') не был виден в модулях, так как было уже сказано , что функция из LCLProc Спасибо всем.
GAMER
энтузиаст
Сообщения: 627 Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:
Сообщение
GAMER » 18.10.2011 13:24:48
что-то UTF8UpperCase перестала у меня работать в транковых версиях лазаруса. То "?" выдает, то пустое.
Odyssey
энтузиаст
Сообщения: 580 Зарегистрирован: 29.11.2007 16:32:24
Сообщение
Odyssey » 18.10.2011 17:01:16
Какая версия FPC? Если 2.7.x -- то неудивительно, её пока лучше не использовать.
GAMER
энтузиаст
Сообщения: 627 Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:
Сообщение
GAMER » 18.10.2011 17:19:28
Тогда не удивительно
Я так понимаю, там что-то перелопачивают в связи с утф-8 (судя по багтрекеру).
Odyssey
энтузиаст
Сообщения: 580 Зарегистрирован: 29.11.2007 16:32:24
Сообщение
Odyssey » 18.10.2011 18:07:13
Там пишут новый тип строк с поддержкой юникода.
GAMER
энтузиаст
Сообщения: 627 Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:
Сообщение
GAMER » 18.10.2011 21:25:02
А что за тип и как его можно использовать?
Odyssey
энтузиаст
Сообщения: 580 Зарегистрирован: 29.11.2007 16:32:24
Сообщение
Odyssey » 18.10.2011 22:34:55
Когда напишут -- узнаем, сюрприз будет
А пока лучше не обращать внимания на FPC trunk и пользоваться релизами или стабильными ветками.