Строки в FPC 2.7
Модератор: Модераторы
- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Строки в FPC 2.7
Кто в курсе - как правильно работают новые уникодные строки в текущем FPC?
Ситуация:
OS - linux. WEB server - apache.
Если код запустить из под обычного пользователя - всё нормально
Если запускаю код из под web сервера (пользователь apache) - то в некоторых случаях банальный вызов строкой функции приводит к тому, что строка теряет русские символы.
Вместо русских символов вижу ????.
Ситуация:
OS - linux. WEB server - apache.
Если код запустить из под обычного пользователя - всё нормально
Если запускаю код из под web сервера (пользователь apache) - то в некоторых случаях банальный вызов строкой функции приводит к тому, что строка теряет русские символы.
Вместо русских символов вижу ????.
А если попробовать применить UTF8ToSys?
evb87ar писал(а):А если попробовать применить UTF8ToSys?
Строго говоря, кодировка страниц, с которой работает Apache, никакого отношения не имеет к операционной системе. Вообще невозможно предполагать на основе каких либо системных переменных или чего еще, в какой кодировке послан запрос или в какой кодировке должна быть отдана страница. Если вопросы - значит не угадали с этой самой кодировкой; Системная локаль UTF8 + страницы, свёрстанные на cp1251, при получении post как раз и будут вопросы после любой функции преобразования строк.
- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
evb87ar
Пробовал - не помогает.
SSerge
Немного не то.
Сейчас обнаружил - проблема в классе TStringsList, вернее в процедуре
Она вызывается из
Именно она из под apacha не верно работает с UTF8 строкой.
Хотя из под обычного пользователя - всё нормально.
Добавлено спустя 17 минут 40 секунд:
Обнаружил магическую последовательность
Вот этот код напрочь сносит крышу у уникодных строк в транковом паскале.
Причём исходная строка содержит кирилические символы в кодировке UTF8, а запуск идёт от системного пользователя (apache).
Пробовал - не помогает.
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 писал(а):исходная строка содержит кирилические символы в кодировке UTF8
Откуда происходит исходная строка?
В любом случае, если из под обычного пользователя - нормально, а из под Apache - нет, то дело может быть лишь в том, что system environment для программ, запускаемых из под Apache, отличается от system environment для обычного пользователя.
Полностью кусок минимального кода, приводящего к странным результатам, нельзя ли увидеть?
А то вдруг строка всё таки поломана уже до того, как с ней начинаются манипуляции.
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
alexs, на такой же последовательности крышу уносит и у релизной версии
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
alexs, Linux локаль UTF-8
Убираем добавление пробела и все работает как положено, с пробелом получаю знаки вопроса
Убираем добавление пробела и все работает как положено, с пробелом получаю знаки вопроса
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
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
- Откуда: г.Ставрополь
- Контактная информация:
Brainenjii
Из под моего пользователя - тоже всё прекрасно.
Тут именно факт того, что это запускается как cgi из под апача.
Из под моего пользователя - тоже всё прекрасно.
Код: Выделить всё
[alexs@alexs demo_26]$ ./test
Тест
Тест
Тут именно факт того, что это запускается как cgi из под апача.
А что выдаст команда locale из под апача?
- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Код: Выделить всё
-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
- Откуда: Спб
alexs, а у тебя строка как получается? Она часом не собирается ли из частей?
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
кстати, тоже замечал. Правда думал, что проблема где-то в окружении, поскольку у меня стартует под root'ом из crontab'a в @reboot да ещё и в виртуалке... Много мест где мог какой-нибудь косяк произойти. Думал, что проблема в том, что приложение стартует до того, как система подгрузит locale и поэтому стартует под какой-нибудь левой...
Если потом перезапустить из под рута же, но вручную - всё ок...
Если потом перезапустить из под рута же, но вручную - всё ок...
