Отправка сообщений nxevent в cp1251
-
Добрый день!
Помогите пожалуйста разобраться в причине почему не отсылается русский текст (кодировка 1251) через nxevent на Linux сборке.
Конфигурация
- Сервер. Linux SL 6.5. x86/Postgres. 1.2.16. netxms.conf->CodePage = CP1251
- Клиент. Linux SL 6.5. x86. 1.2.16. --with-client --with-all-static
Сборку клиента делал в 2х вариантах: UNICODE и не UNICODE.
msg="Это текст"
/usr/local/bin/nxevent -d -u user -P pass 1.1.1.1 SYS_TEST_OK "$msg"*debug* SendMsg("CMD_GET_SERVER_INFO", id:0)
*debug* RecvMsg("CMD_REQUEST_COMPLETED", id:0)
*debug* SendMsg("CMD_LOGIN", id:1)
*debug* RecvMsg("CMD_LOGIN_RESP", id:1)
*debug* SendMsg("CMD_TRAP", id:2)
*debug* RecvMsg("CMD_REQUEST_COMPLETED", id:2)
*debug* Network receiver thread stoppedНа сервер сообщение приходит без текста сообщения.
** 00130000000000800000000200000006
** 00000018000000000000000000000000
** 000000A9010000000000001600530059
** 0053005F0054004500530054005F004F
** 004B000019BE01000000000300BF0100
** 00000000281291090000012A01000000
** 0000000010F290090000005803000001
** 00008000010000000000000001000000
** code=0x0013 (CMD_TRAP) flags=0x0000 id=2 size=128 numFields=6
** [ 24] INT32 0
** [ 169] STRING "SYS_TEST_OK"
** [ 3] INT32 0
** [ 298] STRING ""
** [ 88] INT16 1
** [ 32768] STRING ""Использовал разные варианты LANG и iconv (-f utf8 -t cp1251, -f cp1251 -t utf8) на клиенте - не помогает.
Сделал в nxevent.cpp дополнительную отладку для вывода строки сообщения перед вызовом NXCSendEvent - мой $msg присутствует в той кодировке, которая ушла из скрипта. Добавил оладку (dump) перед отправкой сообщения в session.cpp Похоже теряется уже где-то внутри:
...
*debug* RecvMsg("CMD_LOGIN_RESP", id:1)
Message to be send: Это текст
*debug* SendMsg("CMD_TRAP", id:2)
*debug* Raw data:
** 00130000000000800000000200000006
** 00000018000000000000000000000000
** 000000A9010000000000001600530059
** 0053005F0054004500530054005F004F
** 004B6D7341BE01000000000300BF0100
** 0000000000A262080000012A01000000
** 00000000E88162080000005803000001
** 00008000010000000000000001000000
** code=0x0013 (CMD_TRAP) flags=0x0000 id=2 size=128 numFields=6
** [ 24] INT32 0
** [ 169] STRING "SYS_TEST_OK"
** [ 3] INT32 0
** [ 298] STRING ""
** [ 88] INT16 1
** [ 32768] STRING ""
*debug* RecvMsg("CMD_REQUEST_COMPLETED", id:2)
...
При этом из Windows клиентов все работает (установка из готовой сборки 1.2.16).Заранее спасибо
-
Проблема в том, что nxevent не выставляет code page, и внутренние функции вызывают iconv используя ASCII. Я добавлю возможность выставлять code page для утилит. Как workaround можно добавить в main() в nxevent строчку
SetDefaultCodepage("CP1251");
-
-
Сработало, спасибо.
Изменения nxevent.cpp через command_linestatic TCHAR m_szCP[MAX_DB_STRING] = _T("");
//...
while((ch = getopt(argc, argv, "deho:P:T:u:c:vw:")) != -1)
//...
" -c <codepage> : Specify codepage (default UTF8).\n"
//...
case 'c':
#ifdef UNICODE
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, optarg, -1, m_szCP, MAX_DB_STRING);
m_szCP[MAX_DB_STRING - 1] = 0;
#else
nx_strncpy(m_szCP, optarg, MAX_DB_STRING);
#endif
SetDefaultCodepage(m_szCP);
break;
//...Вызов:
nxevent -u user -P pass -c CP1251 1.1.1.1 SYS_TEST_OK "Это тест"для нормального отображения символов в CL
LANG=ru_RU.cp1251
export LANG
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login