некорректная кодировка в объекте 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 оказались русские буквы в названии макрофункции, что стало вышибать ошибку и сумма прописью в распечатке платежки в иной кодировке.
                    но это пока терпимо и легкоустранимо.

                    Спасибо!
                    >> Ответить
              • Развернуть я сдампил tcp-траффик от сервера приложений. ( sdo  20.09.2010 11:58 )
                5(1)
                как я и думал, искажение присутствует при передаче с сервера приложений. то есть портал винить не в чем. разве что если он некорректно задает кодировку желаемых данных где либо... пожалуй стоит сдампить аналогичный траффик боурма и сравнить их..

                неужели больше не у кого не возникало подобных ошибок? или никто не использовал связку портала с рс-банком через rscom?

                >> Ответить
                • Развернуть Я использовал. ( Иванов Александр  20.09.2010 12:11 )
                  5(1)
                  Причем я делал свой RSCom-сервер и обращался к нему из макроса на портале. Но это было давненько и подробностей я уже не помню, как и написал ранее. Помню, что были похожие проблемы. И вроде бы они решались установкой в соответствие режима GUI на удаленной и локальной стороне и возможно настройками канала. Вот только как я это делал, увы забыл.

                  >> Ответить