Строки в FPC 2.7

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Brainenjii писал(а):Если потом перезапустить из под рута же, но вручную - всё ок...


При запуске из под cron'a, shell скриптам и программам не передается. Соответственно, те переменные окружения, которые выставляет bash, будут отсутствовать.

Аналогичная картина с Апачем, причем хуже. Что он выставляет программе из environment - зависит от него самого и его настроек. Поскольку это - окружение апача, а не операционной системы (фактически, может быть даже "песочницей"), какие либо предположения о кодовых страницах, локали, etc - делать сомнительно. Однако ж, насколько помню, модуль system при инициализации выставляет ряд внутренних переменных, основываясь на окружении (угу, откуда ему еще данные брать). Ну, и некоторые функции полагаются на эти переменные. Но вот чтобы строковая арифметика ломалась... Здесь, imho, навскидку только представляются какие-то ключи компиляции по умолчанию (или неумолчанию), интерпретирующие строки либо как WideStrings (поскольку по описанию, они всегда используют неявные преобразования при операциях с другими строковыми типами), либо ShortStrings символа по 32 (не влезло в представление - хвост обрезался, utf поломан).

Так, размышления...
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Всё так - указал LC_ALL - все заработало
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

1. Проверить что DefaultSystemCodePage = CP_UTF8
2. Передать компилятору информацию о том что строки находятся в UTF8 либо через {$codepage utf8} либо через -Fcutf8
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Павел Ишенин писал(а):1. Проверить что DefaultSystemCodePage = CP_UTF8


Боюсь, в данной ситуации уже надо не проверять, а принудительно устанавливать.
и достаточно ли будет присвоения DefaultSystemCodePage := CP_UTF8; наверно, не всё так просто.

Павел Ишенин писал(а):2. Передать компилятору информацию о том что строки находятся в UTF8 либо через {$codepage utf8} либо через -Fcutf8


Зачем? Насколько я понимаю концепцию, эти ключи имеют значения, когда компилятор должен совершить _преобразования_ строк. Если же текст действительно в UTF-8, и widestrings не используются, что это даст (кроме искажений)?
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Павел Ишенин писал(а):1. Проверить что DefaultSystemCodePage = CP_UTF8

МАСТЕР! Мои респекты и уважухи :D
Было

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

CP_ASCII   = 20127; // us-ascii

Постявил явно в коде

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

 DefaultSystemCodePage:=CP_UTF8;

Всё стало нормально.
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

alexs писал(а):Постявил явно в коде

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

 DefaultSystemCodePage:=CP_UTF8;

Всё стало нормально.


Желательно через SetMultiByteConversionCodePage(CP_UTF8)
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Павел Ишенин писал(а):
alexs писал(а):Постявил явно в коде
Желательно через SetMultiByteConversionCodePage(CP_UTF8)

Спасибо, с этим вызовом ушел от некоторых проблем. Например от этой.
http://bugs.freepascal.org/view.php?id=21104

Добавлено спустя 2 часа 33 минуты 21 секунду:
Кстати.

Если использую SetMultiByteConversionCodePage(CP_UTF8), то не могу переконвертировать строку в Ansi. (1251). Использую UTF8toAnsi
как побороть, или єто баг?

Добавлено спустя 4 часа 23 минуты 56 секунд:
Еще один баг. не работает и Image1.Picture.LoadFromFile(OpenDialog1.FileName);
Ответить