Symfony Внешняя кодировка

Lewik

Новичок
Есть старый (очень) сайт, написанный на php. Он в 1251 весь, включая базу. Остальные ужасы я опущу.
Было задание - допилить к нему функционал (модуль)
Я прикрутил модуль на симфе.

Трогать старый сайт разрешено только в самой легкой форме. Это надо пришлось принять как аксиому. UPD: перекодировать тоже нельзя
При этом корежить саму симфу особого желания нет.

Слать из старого сайта некий запрос новому - я отказался, иногда требуется срочно воспользоваться кодом старого сайта, прибив его гвоздями в симу. Ненадолго. Поэтому в определенном месте старого сайта нечто вроде app.php, которое понятно что делает.

Проблема с кодировкой бд решилась слушателем на postConnect, который шлет SET NAMES 'UTF-8'
Проблема исходящей инфы решилась аналогичным слушателем ну вы поняли...

Проблема входящей инфы:
Сначала был сделан DataTransformer, который перекодирует все данные на вход. Но оказалось, что данные транформируются перед валидацией и в случае невалидности - перекодировка "отменяется".
Теперь сделана абстрактная форма, которая вешает на PRE_SUBMIT перекодировку и невалидность уже не сбрасывает перекоденное.

Я вот чую что это дикий вило-сипед и что данные можно перекодивать как то по удобному.

Еще была идея перекодивать глобалсы реквеста, но в начале мы не въехали как его менять. Вероятно это будет следующим шагом.

Может у вас есть нормальная идея как совладать с кодировкой? ... да и не только с кодировкой =)
 
Последнее редактирование:

keltanas

marty cats
Может у вас есть нормальная идея как совладать с кодировкой? ... да и не только с кодировкой =)
Да. Заниматься проектами, написанными в utf-8. Если сайт на cp-1251, то могу представить, что это за мамонт?
А вообще я не понял, в каком именно месте вопрос? Что куда перекодировать? Лучший способ избавиться от проблем с кодировкой - это использовать везде одинаковую кодировку.
 

Lewik

Новичок
Трогать старый сайт разрешено только в самой легкой форме. Это надо пришлось принять как аксиому.
в том числе я не могу его перекодить. Я не могу отказаться от этого проекта, это моя работа =)
Вопрос: "Может у вас есть нормальная идея как совладать с кодировкой?" Симфа получает данные из внешнего мира через стандартные глобальные массивы (мне кажется что принятое решение кривое). Трабла в том что они в 1251. А так же симфа должна отдавать данные в реквесте в том же 1251 (эта проблема вроде решена нормально).
 

keltanas

marty cats
в том числе я не могу его перекодить. Я не могу отказаться от этого проекта, это моя работа =)
Какждый сам решает, чем ему заниматься. На дворе 21 век. Рабство вроде давно отменили.
Симфа получает данные из внешнего мира через стандартные глобальные массивы
Она получает их по средствам объектов типа Symfony\Component\HttpFoundation\Request или Symfony\Component\Console\Input\InputInterface
(мне кажется что принятое решение кривое).
Напиши свое прямое. Но, остальных оно до сих пор устраивало.
Трабла в том что они в 1251.
Симфони тут вообще не при чем. Виноват Билл.
А так же симфа должна отдавать данные в реквесте в том же 1251 (эта проблема вроде решена нормально).
Она должна отдавать данные в объекте типа Symfony\Component\HttpFoundation\Response или Symfony\Component\Console\Output\OutputInterface

Из всего изложенного я ни грамма не понял, что у тебя за сайт и как ты пытаешься скрещивать его с симфони. И поэтому совершенно не понимаю, чем тебе можно помочь. Только понял, что у тебя траблы с cp1251 (но с ней у всех траблы).
 

Lewik

Новичок
У меня с тобой какое то жуткое недопонимание.

Я решил, что буду заниматься этим. Потому что именно этот проект мне нравится. Я сам выбрал эту работу и сам пробил симфу в этот проект. Если тут 1251, то можешь представить, как это было не просто.

Да, я в курсе, что симфа получает их через эти два класса. Которые в свою очередь могут получать данные из глобальных массивов, что я и делаю. Проблема в том, что массивы в 1251, а значит и данные в реквесте 1251. (Сейчас мне пришло в голову тупо перекодить копии входящих массивов и создавать реквест из них)

Предложенное здесь решение и есть мое. Коллеги ничего другого не предложили.

Я не пытаюсь винить симфу =) Она мне нравится =) ... да и билл мне нравится, но если бы он не порол 1251, всем стало бы лучше.

Ох.. Да, я знаю про Response и консоль... но данные в них должны быть в 1251. Эту проблему я решил слушателем, в котором перекодиваю. Господи, ты серьезно думаешь, что я возвращаю данные из симфы через echo в контроллере или что? =)

Сайт ничем не отличается от обычного (ну за исключением 1251 и прочей байды). Да, проблемы с 1251. Симфа получает данные через реквест. Но, т.к. 1251, то и данные в реквесте в 1251. Их надо перекодить (пока писал, подумал что можно перекодить копии глобальных массивов и создавать реквест из них). Если есть еще идея как перекодить данные из массивов - я буду только за.
 

keltanas

marty cats
Я вот до сих пор не увидел ни слова, как сайт связан с симфони (кроме кодировки), ну да ладно.
Предположим, что тебе надо заставить работать симфони с кодировкой cp1251.
Я вот сколько ни смотрел, так и не увидел ни в Request, ни в Response, чтобы там данные где-то перекодировались или искажались.
Т.е. тебе приходят данные в cp1251, ты их обрабатываешь в cp1251 и потом отдаешь через респонс в cp1251.
На каком из этих шагов возникает трабла?
 

artoodetoo

великий и ужасный
Проблема с кодировкой бд решилась слушателем на postConnect, который шлет SET NAMES 'UTF-8'
А можно поподробнее? SET NAMES говорит мускулю в какой кодировке работает клиент. А клиент, как ты говоришь, работает в 1251. Фигня получается.

Вроде напрашивается таки set names cp1251. И, вероятно, mb_internal_ecoding('windows-1251'), чтобы всех обмануть.
 

Lewik

Новичок
Я косноязычный. Наберитесь терпения =)

Я не могу открыть код сайта. Я бы уже сделал это, если бы мог. Вам бы понравилось, поверьте, врядли вы ТАКОЕ видели =) 1251 - цветочки. Я не могу открыть сайт не по своей придури.

Старый сайт имеет свое подобие роутинга. Этот роутинг определяет, какую модуль надо включить. Модули лежат в папках. У каждого модуля есть файл для инклюда. Роутниг инклюдит файл и модуль активируется. Что творится внутри заинклюденного файла сайту не важно, главное, что заинклюденный файл должен сделать echo контента.
То есть структура примерно такая:
Код:
/moduleA/include_it.php
/moduleB/include_it.php
.....
Этим я и воспользовался.
В этих инклюдах я создаю реквест через createFromGlobals, ну и дальше как в app.php, включая echo респонса: sendResponse. (Тут кстати еще одна прелесть - заголовки принудительно отправляются старым сайтом и отрубить это нельзя, так что я делаю sendContent без заголовков, иначе sendHeaders выругается, что заголовки то уже были отправлены. Еще приходится смотреть типа респонсов и прочее.)

artoodetoo, как я понял, SET NAMES говорит, что приложение работает в такой то кодировке. И теперь задача перекодировки - это головняк базы данных. Старый сайт работает в 1251. Симфа - в утф. Старый сайт не выполняет никаких запросов после запуска симфони-модуля. Если будет выполнять - повешу SET NAMES 1251 на terminate. База кстати постгре.
Таким образом симфа говорит базе (сама база в 1251), что симфа будет общаться с базой на утф. Ну и база повинуется и начинает перекодивать кодировки в обоих направлениях.


Я стараюсь писать на симфе как можно стандартней. Чтобы потом мой труд был легко воспринимаем и не пропал со словами "это что за покемон?"
 

keltanas

marty cats
Ну я недавно рефакторил такую систему на симфони. Сначала перекодировал базу в utf-8, потом файлы, потом написал бандл с контроллером, который инклюдит такие гавно-пейдж-контроллеры.
В итоге для этого легаси создается песочница, в котором он работает. Ну и конечно при этом пишутся функциональные тесты, чтобы ничего не развалить.
Теперь по мере надобности этот гавнокод переписывается на рельсы симфони.

А то что ты описал - так толку от такого использования кроме оверхеда? Если, как я понял, там и окружения symfony-se не поднимается, и значит нельзя ее возможности использовать?
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
был нормальный говносайт, да раньше писали на кирилице, да мутит работать.
сейчас же полное говно со смешаной кодировкой и симфонией сверху велосипеда..

а требовалось настроить инструментарий привыкнуть к старому. разберешься, переделать будет пару неделек. но сначала разберись это и пол года порою требует!
 

Lewik

Новичок
Еще раз про перекодивание:
Трогать старый сайт разрешено только в самой легкой форме. Это надо пришлось принять как аксиому. UPD: перекодировать тоже нельзя
Перекодивать симфу в 1251? Вы шутите?

Сайт огромен, кода под 100 мегов и работает ... нелогично, степень связности внутри просто зашкаливает, обернуть его - это колоссальная работа. Так же сайт работает со стороннимим сервисами. Там нет никакого ООП, просто есть использование классов. Со старым сайтом работает старая команда программистов. Засунуть сайт внутрь симфы - это была первая идея. Но от нее пришлось отказаться.
Идея постепенного переписывания помодульно имеется. Она и лежит в основе переписывания сайта.

Что за symfony-se я не понял. Наверно Standard Edition. Ну он и используется. В соседней со старым сайтом директорией находится директория с обычным Symfony Standard Edition, ну он конечно дополнен бандлами (готовыми и нашими). Я ж говорю - использование симфы, максимально стандартное, насколько это возможно.

WMix, Инструментарий настроил, я собственно сам и проводил апгрейд инструментария. Я прекрасно понимаю как работают инструменты старого сайта (с модулями сложнее). Я работаю со старым сайтом уже год. Вы знаете, когда сидишь и пилишь этот инструментарий и каждый раз это напоминает копипаст готового фреймворка, как то задалбывает писать то, что и так уже есть. Готовое. В конце концов это потеря времени. Вы наверно иронизируете в своем посте =)
 

Тугай

Новичок
Нет никакой проблемы работать c symfony или любым дргим фреймворком в win1251, а не в utf-8. Это просто настройка любой вменяемой ide.
Какие проблемы перекодировать свои исходные файлы в 1251 ?

Если хочется извращения, все свои исходники в utf-8, а на входе и выходе 1251, то по старой памяти когда была такая же дилемма между cp866 и cp1251 (MS-DOS и Windows)
решалась она просто наличием двух финукций to866() и to1251(). Соответственно тут нужны to1251() и toUTF8() - и оборачивайте все строковые параметры ими по ситуации.
 

Lewik

Новичок
Какие проблемы перекодировать свои исходные файлы в 1251 ?
Перекодивать старый сайт в утф - не дадут другие. Сказал же. Перекодивать симфу в 1251 - это извращение =) Я не представляю этого. Я об этом тоже уже говорил.
В дополнение к перекодиванию старого сайта в утф: старый сайт читает инфу со сторонних источников: сайтов, файлов и т.п. И если они в 1251, то никаких iconv и прочих подобных вещей я не найду в месте получения информации. И искать в 100 мегабайтах все такие веселые места - я не смогу.

Соответственно тут нужны to1251() и toUTF8() - и оборачивайте все строковые параметры ими по ситуации.
Ммм... правда? =) А я тут сижу кумекаю как же мне это сделать =) Но мне то нужны приемы в каком конкретно месте это надо перекодировать. Слушателем на какой то ивент или еще как либо? Проблема именно в этом.
 

Тугай

Новичок
Lewik, зачем симфу перекодировать, там что есть текст на русском ? А свои исходники держать в 1251, ничего не мешает..
 

keltanas

marty cats
Сказал же. Перекодивать симфу в 1251 - это извращение =)
Какое извращение? Ты ее хоть в ISO перекодируй, будет тоже самое.
Все, что нужно держать в кирилической (или юникодной) кодировке - это словари для i18n ))
 

Lewik

Новичок
Хех.. ну да, вы правы. Требуется только русский текст держать в нужной кодировке. Тогда все ок и перекодивать ничего не надо.
Решение интересное. По идее и русскоязычные коменты в утф не должны мешать, как мне кажется (отказаться от них не могу - не все в команде знают английский, я и сам тупить буду). Сразу применить решение не смогу - из-за виртуозности старого сайта иногда приходится писать кирилличиские строки, причем не связанные с выводом на экран.

Я правильно понимаю, что файлы php нет необходимости переводить в 1251?
 

artoodetoo

великий и ужасный
правильно. у тебя ведь в php нет строковых литералов с русским текстом? значит можешь считать, что твои файлы уже в ASCII )))
 

Lewik

Новичок
Большое спасибо. Вы трое мне очень помогли. Не сразу, но я смогу локализовать русский язык в отдельных файлах. А коменты если не будут работать - будем на английском оставлять.
 
Сверху