Строки в FPC 2.7

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

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

Строки в FPC 2.7

Сообщение alexs » 21.01.2012 16:30:00

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

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

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

Если запускаю код из под web сервера (пользователь apache) - то в некоторых случаях банальный вызов строкой функции приводит к тому, что строка теряет русские символы.
Вместо русских символов вижу ????.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Строки в FPC 2.7

Сообщение evb87ar » 21.01.2012 17:36:51

А если попробовать применить UTF8ToSys?
Аватара пользователя
evb87ar
новенький
 
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Re: Строки в FPC 2.7

Сообщение SSerge » 21.01.2012 17:49:19

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


Строго говоря, кодировка страниц, с которой работает Apache, никакого отношения не имеет к операционной системе. Вообще невозможно предполагать на основе каких либо системных переменных или чего еще, в какой кодировке послан запрос или в какой кодировке должна быть отдана страница. Если вопросы - значит не угадали с этой самой кодировкой; Системная локаль UTF8 + страницы, свёрстанные на cp1251, при получении post как раз и будут вопросы после любой функции преобразования строк.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Строки в FPC 2.7

Сообщение alexs » 21.01.2012 20:05:56

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).
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Строки в FPC 2.7

Сообщение SSerge » 22.01.2012 07:04:17

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


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

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

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

А то вдруг строка всё таки поломана уже до того, как с ней начинаются манипуляции.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Строки в FPC 2.7

Сообщение Padre_Mortius » 22.01.2012 23:15:28

alexs, на такой же последовательности крышу уносит и у релизной версии
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Строки в FPC 2.7

Сообщение alexs » 23.01.2012 00:48:01

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

Строка 100% валидная - берётся из БД.
Padre_Mortius
В каком окружении проверял?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Строки в FPC 2.7

Сообщение Padre_Mortius » 23.01.2012 09:04:43

alexs, Linux локаль UTF-8
Убираем добавление пробела и все работает как положено, с пробелом получаю знаки вопроса
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Строки в FPC 2.7

Сообщение Brainenjii » 23.01.2012 09:19:47

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
Тест
Тест
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Строки в FPC 2.7

Сообщение alexs » 23.01.2012 16:41:41

Brainenjii
Из под моего пользователя - тоже всё прекрасно.
Код: Выделить всё
[alexs@alexs demo_26]$ ./test
Тест
Тест

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

Re: Строки в FPC 2.7

Сообщение v-t-l » 23.01.2012 16:46:48

А что выдаст команда locale из под апача?
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Строки в FPC 2.7

Сообщение alexs » 23.01.2012 17:38:36

Код: Выделить всё
-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
Шаблоны одни и теже. Исходники тоже.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Строки в FPC 2.7

Сообщение Padre_Mortius » 23.01.2012 21:58:03

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

Re: Строки в FPC 2.7

Сообщение alexs » 23.01.2012 23:53:20

Именно...
Но части заведомо правильные. Перекодировок нет. Все исходники в UTF8, все данные в БД также в UTF8.
Образец кода, в котором строки стреляются я приводил выше.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Строки в FPC 2.7

Сообщение Brainenjii » 24.01.2012 09:39:21

кстати, тоже замечал. Правда думал, что проблема где-то в окружении, поскольку у меня стартует под root'ом из crontab'a в @reboot да ещё и в виртуалке... Много мест где мог какой-нибудь косяк произойти. Думал, что проблема в том, что приложение стартует до того, как система подгрузит locale и поэтому стартует под какой-нибудь левой...
Если потом перезапустить из под рута же, но вручную - всё ок...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru