некорректная кодировка в объекте IAbsObj (портал 5.20.021.6)
0 (0)
некорректная кодировка в объекте IAbsObj (портал 5.20.021.6) ( sdo 16.09.2010 18:23 )
5(1)вот так пишет в выписке:
Клиент: _ткрытR_ акциR-_р-R_ Rбщ_ствR .. (предполагалось Открытое акционерное общество).
Наименование банка аналогично.
порыл по макросам - строки искажены внутри объекта IAbsObj
Работа происходит через удаленную загрузку АБС интерфейса.
пробовал менять RsScript, который использует rcomcnt.exe от сервера приложений - не помогает (при заменах рестартовал appsrv).
куда копать, товарищи?
>> Ответитьгде-то в remote call.. ( sdo 17.09.2010 14:46 )
5(1)сваял макросы, достающие наименование через remote RSL - результат тот же. искажены строки.
значит, ошибка не в самом IAbsObj, а в методах работы с DOS кодировкой.
в макросе, достающем инфу из рсбанка конвертнул в ANSI перед возвратом - якши насос.
вот так и выкручиваемся.
>> Ответитьплохо дело. ( sdo 20.09.2010 10:00 )
5(1)с искажениями достается все что должно доставаться из рс-банка.
все поля документов и т.д.
помогите пожалуйста найти причину искажений. Неужели придется писать свои "костыли" - аналог IAbsObj ?
Боурм ведь достает все правильно. Работает через тот же сервер приложений, что и портал.
Расположены Боурм и портал на одной машине.
>> ОтветитьА чего ее искать, причину-то? ( Иванов Александр 20.09.2010 10:18 )
5(1)Она в том, что внутри не Юникод. Соответственно надо знать, в какой кодировке данные. Есть кодировка в канале, в RSL-процессоре. Внутри RSL есть такое сообщение, IM_ISGUI. Обработчик сообщений на него говорит true или false. В портале это определяется параметром файла конфигурации RSLModeIsGUI. Если оно не будет соответствовать кодировке данных, получаемых через RSCom, то будут крокозябры. Вот только как бы в других местах кодировка не отъехала после его изменения, насколько я помню, там куча макросов в 866 кодировке...
>> Ответитьдалеко я бы даже сказал, не юникод.... :((( ( sdo 20.09.2010 10:35 )
5(1)1. Не сочтите придиркой к словам - у меня не кракозябры, а потеря заглавных и некоторых русских букв. Мне кажется это происходит из-за двойной перекодировки туда-сюда или неверных таблиц символов где-то.
2. сделал макрос, возвращающий строку в DOS кодировке. с портала запускаю его через rscom и пишу в файл - получаю в файле сбитую строку. Мое мнение - проблема в обертке переменных rsl в activex объекты и обратно.
3. слово RSLModeIsGUI из шести мест поиска (файлы портала, боурма, IABS500, сервера приложений, реестры машин с боурмом и рс-банком) было найдено только в одном месте: ..\InetClnt\Obj\RSPBrain.dll.
>> ОтветитьОткуда там какие-то актив-иксы? ( Иванов Александр 20.09.2010 11:04 )
5(1)1. Ну не кракозябры, так пускай.
2. Проблема проистекает при интерпретации данных получаемых из RSCom.
3. Ну собственно это и есть модуль портала, обеспечивающий выполнение RSL. Еще полагаю можно было бы найти это слово в документации портала, хотя точно не уверен, документировал я его или нет, и если да, то попало ли оно из технологической документации в пользовательскую.
Могу еще привести код функции, используемой внутри портала для перекодировок.
static LPCSTR CheckCharSet(bool IsGUIMode, LPCSTR p) { LPSTR buf; if(p && (IsGUIMode != __aiIsRslGUIMode())) { buf = __ainformat("%s", p); if(IsGUIMode) { ::CharToOem(buf, buf); } else { ::OemToChar(buf, buf); } p = buf; } return p ? p : ""; }
>> Ответитьсверил список dll, используемых боурмом и порталом ( sdo 20.09.2010 11:34 )
5(1)отличия нашел лишь в fs32cm.dll.
заменил в портале - взяв от боурма. - не помогло.
Александр, даже если вы мне скажете куда прописать этот параметр и чему сделать его равным, боюсь не поможет - но почему бы не попробовать? скажите как.
я забыл сказать что макрос, возвращающий строку-константу, вертает ее неискаженной, если отдавать ее в ANSI-кодировке.
С чего я взял activex? - со слов Кубрина "..Модуль RsEngine.dll - реализует стандартные COM интерфейсы для интерпретатора Object RSL..."
мне кажется схожая схема используется и тут.
а мы можем как-нибудь проверить на каком этапе происходит искажение?
>> ОтветитьНу он может много чего реализует для Object RSL... ( Иванов Александр 20.09.2010 12:01 )
5(1)Здесь же, насколько я понимаю, речь идет об удаленном выполнении макроса сервером RSCom. То есть создается канал к удаленному серверу выполнения макросов RSL, забыл, как он там называется. Удаленный экземляр интерпретатора RSL работает в определенной кодировке и выдает в канал данные именно в ней. Локальный экземляр интерпретатора RSL тоже работает в своей кодировке (для портала по-умолчанию это ANSI, т.е. RSLModeIsGUI=1) и интерпретирует полученные данные соответствующим образом. Можно ли изменить кодировку на удаленном сервере я точно не помню, вроде бы можно. Что-то вроде еще было насчет кодировки в канале, в term.ini кажется, но это я тоже смутно помню, за давностью лет. Точно знаю только про портал. Там режим кодировки интерпретатора RSL управляется вышеупомянутым параметром в файле конфигурации портала, секция параметров сервера. Для включения OEM нужно указать RSLModeIsGUI=0. Но это если только для проверки, а то макросам поплохеет, в которых сообщения в оконной кодировке.
Так что мне кажется, что принципиально возможных мест искажения два:
- удаленный RSL/канал;
- канал/локальный RSL.
После изменения значения RSLModeIsGUI данные должны измениться. Если в правильную сторону, то имеем второй случай, если нет, то первый.
>> ОтветитьВы правы. Помогло RSLModeIsGUI=0 ( sdo 20.09.2010 14:16 )
5(1)как ни удивительно. :)
прописал
RSLModeIsGUI=0
в секцию [RSPortal] рядом с параметром RsComSupport=1
кое-что уехало, как вы и говорили - в частности в макросе objPatt.mac оказались русские буквы в названии макрофункции, что стало вышибать ошибку и сумма прописью в распечатке платежки в иной кодировке.
но это пока терпимо и легкоустранимо.
Спасибо!
>> ОтветитьЭто означает, что макрос на удаленной стороне работает в OEM кодировке. ( Иванов Александр 20.09.2010 14:27 )
5(1)Мне кажется, что лучше было бы там что-нибудь крутить, но хозяин-барин...
>> Ответитьа почему макрос? разве не iabs.d32 ? ( sdo 20.09.2010 14:30 )
5(1)или как он там..
мне кажется на remote крутить опаснее - им ведь еще и боурм пользуется. и эту связку нарушать не хотелось бы.
да и макросов в боурме намного больше чем в портале.
>> ОтветитьНу я не знаю, макрос или DLM, разницы-то нет практически... ( Иванов Александр 20.09.2010 14:52 )
5(1)В любом случае надо приводить в соответствие кодировки во всех подсистемах к одному знаменателю...
>> Ответитьмакрос я бы смог развинтить, и потискать - вот и разница :) ( sdo 20.09.2010 15:28 )
5(1)я с Вами совершенно согласен - насчет общей кодировки.
я за юникод вообще.
но как себе это представляете один знаменатель в нашем случае?
конвертить базы рс-банка в ANSI ? - легче имхо сменить АБС.
отдавать клиентам DOS ? - тоже не вариант.
Спасибо и на том что нашелся хотя б такой вариант
>> ОтветитьНу если помогло, то и ладно... ( Иванов Александр 20.09.2010 15:56 )
5(1)
А удивительного ничего нет... ( Иванов Александр 20.09.2010 14:56 )
5(1)Интерпретатор RSL перед отдачей данных в канал приводит их к кодировке канала. Делает он это просто: смотрит гуй он или нет и соответственно действует. При извлечении данных из канала он поступает аналогично. Если режимы на концах разные: беда.
>> Ответить
я сдампил tcp-траффик от сервера приложений. ( sdo 20.09.2010 11:58 )
5(1)как я и думал, искажение присутствует при передаче с сервера приложений. то есть портал винить не в чем. разве что если он некорректно задает кодировку желаемых данных где либо... пожалуй стоит сдампить аналогичный траффик боурма и сравнить их..
неужели больше не у кого не возникало подобных ошибок? или никто не использовал связку портала с рс-банком через rscom?
>> ОтветитьЯ использовал. ( Иванов Александр 20.09.2010 12:11 )
5(1)Причем я делал свой RSCom-сервер и обращался к нему из макроса на портале. Но это было давненько и подробностей я уже не помню, как и написал ранее. Помню, что были похожие проблемы. И вроде бы они решались установкой в соответствие режима GUI на удаленной и локальной стороне и возможно настройками канала. Вот только как я это делал, увы забыл.
>> Ответить