LINUX.ORG.RU

Где делать перекодировку? Посоветуйте архитектурное решение.

 , , , ,


0

2

Есть приложение, сейчас работает как обычный CGI, «запрос-ответ». На серверной стороне рассматриваем что от нас хотели, спрашиваем базу, отдаём ответ базы в Text::Template шаблон.
Особенность системы - в базе 1251, браузеру разумеется выдаётся utf-8. Сейчас я в шаблонах пишу вроде [%row.name FILTER Recode%], и всё хорошо, все довольны, код не загромождён вызовами Recode...
А теперь я хочу перевести часть обработки на Ajax. Не грузить всю страницу по каждому чиху, а отдавать данные например в JSON, а на клиенте уже красиво показывать. И тут внезапно оказалось, что Text::Template шаблоны идут стороной, что между выдачей сервера и жабаскриптом никакой прослойки нет. И обычный код выдаёт клиенту чёрт знает что.
Сейчас таких страниц немного, я временно вкорячил обратно в серверный код Recode-вызовы, но мне это не нравится, у меня половина кода будет из них состоять.

Опять же, надо какие-то шаблоны для жабаскрипта придумать, чтобы не писать вручную $block.append(«<div class=' ' id=' '>»+data.value+«</div>»).... Так что если кто приличный js-шаблонизатор посоветует, тоже спасибо.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от Olegymous

То есть может и умеет, но я не буду напрягать ораклистов на тему «ребята, а не могли бы вы переписать 100500 процедур так, чтобы они выдавали utf-8»?

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Это рулится на уровне параметров передаваемых при коннекте к базе. Говоришь ей, чтобы она отдавала тебе все данные в utf-8.

Olegymous ★★★
()
Ответ на: комментарий от Xellos

и не надо, просто делаешь дамп данных, перекодируешь их, меняешь свойства таблиц на UTF-8 и импортишь обратно.

BaBL ★★★★★
()
Ответ на: комментарий от BaBL

Нет, базу мы не трогаем. Это не обсуждается. Она десять лет хранит данные в 1251, и ещё месяц, до самого конца света, будет их так хранить.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Olegymous

NLS_LANG будет мне перекодировку делать?

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Olegymous

напиши враппер над интерфейсом к БД

Хмм. Враппер-то у меня есть... Просто его функции в половине случаев состоят из $sth=$dbh->prepare; $sth->execute; return $sth->fetchall_arrayref({})... Делать лишний обход всех возвращаемых данных не хочется.

Xellos ★★★★★
() автор топика

Неужели там нет, что-то на подобие:

SET NAMES UTF8

VirRaa ★★★
()
Ответ на: комментарий от Xellos

Умеет.

► export NLS_LANG="RUSSIAN_CIS.UTF8"; echo -e "select * from tmp0;\nexit" | sqlplus -s test/test@127.0.0.1/test

TEST
--------------------------------------------------------------------------------
жопа

► export NLS_LANG="RUSSIAN_CIS.CL8MSWIN1251"; echo -e "select * from tmp0;\nexit" | sqlplus -s test/test@127.0.0.1/test

TEST
--------------------------------------------------------------------------------
����
Ja-Ja-Hey-Ho ★★★★★
()

Опять же, надо какие-то шаблоны для жабаскрипта придумать, чтобы не писать вручную $block.append(«<div class=' ' id=' '>»+data.value+«</div>»).... Так что если кто приличный js-шаблонизатор посоветует, тоже спасибо.

В одном своем проекте рендерю ответ с помощью шаблонизатора на сервере, отдаю обычный html, который уже показываю у клиента. Для небольших задач вполне хватает, тем более не отрывается от шаблонов остальных частей проекта.

gruy ★★★★★
()

Я использую jsrender - очень быстрый.

ну и о гибкости. Я вот так сделал.

гружу шаблоны в массив, отдаю их через json и сразу рендерю.

spiritkhl
()
Ответ на: комментарий от Xellos

А че делать будете если начнется хорошая нагрузка? Кодирование нехило так будет тормозить систему. Сталкивался, приходилось все базы кодировать.

Я просто про то, что может сейчас это будет сделать легче чем потом

spiritkhl
()
Ответ на: комментарий от spiritkhl

Так не только кодирование... Всяческая постобработка, типа форматирования телефонных номеров или времени работы.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Ja-Ja-Hey-Ho

Надо попробовать. Это уберёт часть проблем.

Xellos ★★★★★
() автор топика

Всем спасибо, NLS_LANG действительно помог избавиться от recode почти везде.
Но вопрос с постобработкой данных остаётся. Раньше она произодилась в шаблонах, а сейчас где делать?

Xellos ★★★★★
() автор топика
Ответ на: комментарий от r_asian

1. Зачем мне делать JSON через TT, это лишняя сущность получается. Я JSON делаю через JSON::encode, просто отдаю ему структуру данных.

2. Э... что это? Как это можно вообще использовать? Тупо писать отдельный шаблон для JSON-а? Нафига?

Xellos ★★★★★
() автор топика
Последнее исправление: Xellos (всего исправлений: 1)
Ответ на: комментарий от Xellos

Спасибо. Просто, ИМХО, таким способом достигается единообразие. Т.е. из движка нормализованные данные. В tt ты уже разруливаешь представление и пост-обработку.

Тупо писать отдельный шаблон для JSON-а? Нафига?

Не совсем понял в чём вопрос.
//не r_asian, но сначала треда думал написать это же.

anonymous
()
Ответ на: комментарий от anonymous

Основной вопрос наверное снимается. Я сначала решил, что представлением будет заниматься клиент и жабаскрипт, но сейчас уже сомневаюсь. Надо ещё думать, чего я хочу.

Но использование Template::Plugin::SimpleJson всё равно осталось для меня непонятным - что с ним делать? Как его можно полезно использовать?

Xellos ★★★★★
() автор топика

https://www.w3.org/International/questions/qa-htaccess-charset.ru.php

Соответственно, включаете .htaccess в cgi-bin, делаете там .htaccess, указываете кодировку 1251. В результате браузеру будет отдаваться (и приниматься) всё в win-1251. Интересно, как будет себя вести в случае фреймов или jQuery (разные кодировки на одной странице).

ktulhu666 ☆☆☆
()
Ответ на: комментарий от ktulhu666

В результате браузеру будет отдаваться (и приниматься) всё в win-1251

Спасибо, идиотских решений не требуется.

разные кодировки на одной странице

О боги.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Решение не самое лучшее, но и идиотским я его бы не назвал. Чем именно Вас не устраивает данное решение (объективно)?

ktulhu666 ☆☆☆
()
Ответ на: комментарий от ktulhu666

Тем, что на клиенте должна быть одна кодировка - utf8. Всё остальное - чистое и незамутнённое зло. И если по каким-то историческим причинам бэкенд работает в другом формате, клиент страдать не должен.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Но использование Template::Plugin::SimpleJson всё равно осталось для меня непонятным - что с ним делать? Как его можно полезно использовать?

Я не совсем понимаю вопрос.
Cтруктура данных добралась до tt. Там она приводится к нужному ввиду, а потом конвертируется плагином

doSomething data
SimpleJson.toJson(data)
в json.

anonymous
()
Ответ на: комментарий от anonymous

Нее, это что-то совсем странное. Это ж сколько уже проходов получается - сформировать данные, передать их в TT, в TT их обойти, сформировать ещё раз, и передать дальше. А дальше их будут ещё раз разбирать. Зачем тогда TT, если он будет только фильтры вызывать - так это и в коде сделать можно, даже более разумно выйдет.

Xellos ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Мне кажется, Вам тогда нужно бекенд переписать, если Вы не готовы решать проблему костылями, которые Вам насоветовали.

ktulhu666 ☆☆☆
()
Последнее исправление: ktulhu666 (всего исправлений: 1)
Ответ на: комментарий от Olegymous

Ха-ха-ха. NLS_LANG прекрасно справляется с запросами. Но СОВЕРШЕННО ничего не делает со значениями, получаемыми из bind_param_inout, то есть из процедур. Пц.

Xellos ★★★★★
() автор топика
28 февраля 2013 г.
Ответ на: комментарий от Xellos

Вопрос с перекодировкой решён - NLS_LANG действительно перекодирует любые запросы, но для bind_param_inout не выставляет волшебный utf8-флаг.
js-шаблонизатор - jsrender. Требует где-то дня на изучение, потом дико доставляет.

Xellos ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.