Перешёл с 0.9.30на 1.4 - проект не работает. Опять юникод???

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

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

postscripter
новенький
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Перешёл с 0.9.30на 1.4 - проект не работает. Опять юникод???

Сообщение postscripter »

Привет! Был проект под Lazarus 0.9, при переходе на 1.4.2 перестал работать. Пример:


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

var folder:string;

 folder:=ExtractFilePath(application.ExeName);
 try
  if fileexists(folder+'123.txt') then memo1.Lines.LoadFromFile(folder+'123.txt');
 except
  Showmessage(SysErrorMessage(GetLastError));
 end; 


1) Отладчик показывает, что folder='c:\????????\'.
2) Fileexists выдаёт TRUE.
3) Затем перехватывается исключение "Unable to load file C:\Русский\123.txt". (без try его будет видно)
4) Затем ShowMessage показывает текст ошибки: '???? ?? ???? ??? ? ? ????? [Ok]'

В начале модулей и в опциях сборки обнаружил {$H+}, но он ни на что не влияет. Где ещё ковырять? Повторюсь, этот код работал раньше (правда, насчёт GetLastError не уверен).

NeedRTLAnsi выдаёт True. Замечательно, моя windows не поддерживает юникодные api?
Последний раз редактировалось postscripter 02.08.2015 03:13:04, всего редактировалось 1 раз.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

FileExists работает в кодировке оси, в Windows это cp1251,
LoadFromFile же скорей всего берет в utf8
postscripter
новенький
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Сообщение postscripter »

Понятно, почему это происходит. Непонятно, что делать, и как оно работало до этого. Что именили в Лазарусе.

Можно конечно пройтись автозаменой FileExists->FileExistsUTF8, но кроме него там тьма других функций, и хз какие из них теперь не работают.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Работайте только в utf8 даже если для этого нужно явно преобразовывать
postscripter
новенький
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Сообщение postscripter »

Ism писал(а):Работайте только в utf8 даже если для этого нужно явно преобразовывать


Что для этого нужно менять? Проект большой.

Сейчас происходит следующее:
1) Тип string равносилен ansistring благодаря {H+}.
2) Переменная folder получает ansi-значение, потому что цепочка вызовов extractfilepath(...) в конце обращается к shortstring функции system.ParamStr.
3) Вызов FileExists отрабатывает корректно, потому что ожидает анси-строку и ссылается на неюникодную версию WINAPI без -w. Кстати, почему?
4) Далее. Вызов LoadFromFile в exe-шнике, откомпилированном версией 0.9.30, приводит к созданию объекта типа TFILESTREAM.
4.1) В новой версии Лазаруса создаётся объект TFILESTREAMUTF8, который принимает на вход нашу ansi-строку Folder и обламывается.

Они поменяли внутреннюю логику работы некоторых базовых классов. Где найти список, и что теперь должен поменять я?
Безымянный 1.png

На скриншоте - как работает старая версия.

Добавлено спустя 1 час 11 минут 2 секунды:
Может быть, моя IDE скомпилирована с ключом -dEnableUTF8RTL? Правильно я понимаю, что когда FPC 2.7.1 с поддержкой этого ключа войдёт в состав IDE, проблема разрешится сама собой, и все системные вызовы API будут -w? А до этого момента - костылить с AnsiToUTF8 или отсиживаться на 0.9?

Добавлено спустя 37 минут 38 секунд:
К сожалению. мат на форуме запрещён. Поэтому вот вам картинка.

Изображение

А что бы вы сделали с разработчиками, у которых
TMemo.Lines.SaveToFile() требует юникода, а TStringList.SaveToFile() требует ANSI?

Я начинаю понимать, кажется, за что страдал Лазарь.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

postscripter писал(а):при переходе на 1.4.2 перестал работать

Такое и на 1.2.6 не будет работать.

postscripter писал(а):Где ещё ковырять?

Пробовать UTF8ToAnsi и AnsiToUTF8 в каждом неработающем варианте.

postscripter писал(а):А что бы вы сделали с разработчиками

Идёт бракоразводный процесс.
Судья спрашивает бабу: - Почему разводитесь?
- Он меня сексуально не удовлетворяет.
Судья обращается к мужику: - Вы почему не исполняете супружеский долг?
Встаёт, качаясь от голода, худой и бледный муж и дрожащим голосом произносит.
- Граждане судьи налейте мне тарелку супа и я тут весь зал переебу.
postscripter
новенький
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Сообщение postscripter »

налейте мне тарелку супа и я тут весь зал

Не знаю как зал, а я с ним реально зае*лся :shock: Это где видано, чтобы два экземпляра одного класса TStringList работали по-разному? Как вообще?? Такое только в DelphiXE стало возможно через класс-хелперы.

Байку возьму на вооружение :wink:
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

достали тупые вопросы про кодировки. всем кто не понимает кодировки и их смысл - идти и учить
postscripter
новенький
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Сообщение postscripter »

достали тупые вопросы про кодировки. всем кто не понимает кодировки и их смысл - идти и учить

Проблема решена, спасибо.
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

В самом деле, с кодировками в Лазаре тягомотина. Тоже затрахался, разрабатывая и особенно отлаживая код. Есть большой опыт работы в Дельфи, как в старых, так и в новых, Юникоднутых - там никаких проблем не испытывал. Но в Лазаре, когда одним функциям подавай ANSI, другим - UTF8, и не всегда понятно, когда что использовать, просто бардак.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

>>когда одним функциям подавай ANSI, другим - UTF8
+ на сколько я понял FPC начиная с долгожданного 3.0 будет Unicode (UTF-16), то биш нужно будет балансировать между 3 кодировками )))
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

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

slyubez писал(а):Но в Лазаре, когда одним функциям подавай ANSI, другим - UTF8, и не всегда понятно, когда что использовать, просто бардак


В самой операционке тоже так. Существует, к тому же, дублирование части ANSI и UTF8 функций.
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

В самой операционке тоже так. Существует, к тому же, дублирование части ANSI и UTF8 функций.

Это в Линуксе-то?
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

slyubez писал(а):Тоже затрахался, разрабатывая и особенно отлаживая код. Есть большой опыт работы в Дельфи, как в старых, так и в новых,


Потому, что в Delphi одна кодировка - виндовская
postscripter
новенький
Сообщения: 24
Зарегистрирован: 31.05.2012 20:22:01

Сообщение postscripter »

qivi писал(а):на сколько я понял FPC начиная с долгожданного 3.0 будет Unicode (UTF-16)



Так вроде с 2.7.1 уже обещают сделать всё хорошо. Системные вызовы будут unicode, внутренняя кухня (RTL) тоже.
Последний раз редактировалось postscripter 03.08.2015 18:11:31, всего редактировалось 1 раз.
Ответить