Строки в FPC 2.7

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

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

Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Строки в FPC 2.7

Сообщение alexs »

Кто в курсе - как правильно работают новые уникодные строки в текущем FPC?

Ситуация:
OS - linux. WEB server - apache.

Если код запустить из под обычного пользователя - всё нормально

Если запускаю код из под web сервера (пользователь apache) - то в некоторых случаях банальный вызов строкой функции приводит к тому, что строка теряет русские символы.
Вместо русских символов вижу ????.
Аватара пользователя
evb87ar
новенький
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Сообщение evb87ar »

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

Сообщение SSerge »

evb87ar писал(а):А если попробовать применить UTF8ToSys?


Строго говоря, кодировка страниц, с которой работает Apache, никакого отношения не имеет к операционной системе. Вообще невозможно предполагать на основе каких либо системных переменных или чего еще, в какой кодировке послан запрос или в какой кодировке должна быть отдана страница. Если вопросы - значит не угадали с этой самой кодировкой; Системная локаль UTF8 + страницы, свёрстанные на cp1251, при получении post как раз и будут вопросы после любой функции преобразования строк.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

evb87ar
Пробовал - не помогает.
SSerge
Немного не то.
Сейчас обнаружил - проблема в классе TStringsList, вернее в процедуре

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

Function GetNextLine (Const Value : String; Var S : String; Var P : Integer) : Boolean;


Она вызывается из

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

Procedure TStrings.SetTextStr(const Value: string);


Именно она из под apacha не верно работает с UTF8 строкой.
Хотя из под обычного пользователя - всё нормально.

Добавлено спустя 17 минут 40 секунд:
Обнаружил магическую последовательность

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

function TestS(const S:string):string;
begin
  Result:='' + S + ' ';
end;


Вот этот код напрочь сносит крышу у уникодных строк в транковом паскале.
Причём исходная строка содержит кирилические символы в кодировке UTF8, а запуск идёт от системного пользователя (apache).
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

alexs писал(а):исходная строка содержит кирилические символы в кодировке UTF8


Откуда происходит исходная строка?

В любом случае, если из под обычного пользователя - нормально, а из под Apache - нет, то дело может быть лишь в том, что system environment для программ, запускаемых из под Apache, отличается от system environment для обычного пользователя.

Полностью кусок минимального кода, приводящего к странным результатам, нельзя ли увидеть?

А то вдруг строка всё таки поломана уже до того, как с ней начинаются манипуляции.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

alexs, на такой же последовательности крышу уносит и у релизной версии
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

SSerge писал(а):Откуда происходит исходная строка?

Строка 100% валидная - берётся из БД.
Padre_Mortius
В каком окружении проверял?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

alexs, Linux локаль UTF-8
Убираем добавление пробела и все работает как положено, с пробелом получаю знаки вопроса
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Brainenjii@bworkplace:~/Develop> cat 1.pas

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

program Project1;

{$mode objfpc}

function TestS(const S:string):string;
begin
  Result:='' + S + ' ';
end;

function TestS2(const S:string):string;
begin
  Result:='' + S;
end;

begin
  WriteLn(TestS('Тест'));
  WriteLn(TestS2('Тест'));
end.

Brainenjii@bworkplace:~/Develop> fpc 1.pas
Free Pascal Compiler version 2.6.0 [2012/01/02] for i386
Copyright (c) 1993-2011 by Florian Klaempfl and others
Target OS: Linux for i386
Compiling 1.pas
Linking 1
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
19 lines compiled, 0.1 sec
Brainenjii@bworkplace:~/Develop> ./1
Тест
Тест
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Brainenjii
Из под моего пользователя - тоже всё прекрасно.

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

[alexs@alexs demo_26]$ ./test
Тест
Тест

Тут именно факт того, что это запускается как cgi из под апача.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

А что выдаст команда locale из под апача?
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

-bash-4.2$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=


В консоле вроде всё нормально.
Но вот через http - косяк.
Чтобы не быть голословным
Текущее полжение дел
http://w7site.ru/cgi-bin/pm_web?LoginPage
А это - было собрано ранее - когда ещё не было уникодных строк в RTL FPC.
http://w7site.ru/cgi-bin/pm_web1?LoginPage
Шаблоны одни и теже. Исходники тоже.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

alexs, а у тебя строка как получается? Она часом не собирается ли из частей?
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Именно...
Но части заведомо правильные. Перекодировок нет. Все исходники в UTF8, все данные в БД также в UTF8.
Образец кода, в котором строки стреляются я приводил выше.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

кстати, тоже замечал. Правда думал, что проблема где-то в окружении, поскольку у меня стартует под root'ом из crontab'a в @reboot да ещё и в виртуалке... Много мест где мог какой-нибудь косяк произойти. Думал, что проблема в том, что приложение стартует до того, как система подгрузит locale и поэтому стартует под какой-нибудь левой...
Если потом перезапустить из под рута же, но вручную - всё ок...
Ответить