Страница 1 из 1

шум в строке... ICONV

Добавлено: 31 мар 2015, 23:35
1g0r
Имеем строку...
Set(foo=парам пам пам);

конвертируем эту строку из UTF8 в CP1251 (консоль в UTF8, а передать надо в WINDOWS-1251)
Set(foo=${ICONV(UTF-8,WINDOWS-1251,${foo})});

В результате в переменной ${foo} имеем начало строки в CP1251 и кусок в этой же строке изначального в UTF8(то есть в одной стоке присутствует и правильная кодировка и шумы из начальной строки).

Как правильно это побороть я так и не понял.
Пока сделал костыли в виде

Set(foo=парам пам пам);
Set(foo=${foo}[cut]); // в конец строки добавил несколько символов которые будут являться разделителем
Set(foo=${ICONV(UTF8,CP1251,${foo})}); //перекодирую строку
Set(foo=${CUT(foo,"[cut]",1)}); // отрезаю шум, который будет после заданного разделителя
profit.

Это хоть и работает, но мне кажется должно быть более правильное решение данной проблемы.

Не понимаю поведения ICONV в астериске... думается мне, что это из-за того что кирилица кодируется в одном случае 2мя байтами а в другом 1м байтом.

Как же более корректно побороть сей недуг не навешивая лишних действий?!?!

Re: шум в строке... ICONV

Добавлено: 01 апр 2015, 07:47
virus_net
Скорее всего это происходит из-за того что вы переприсваиваете переменную:
1g0r писал(а):Set(foo=${ICONV(UTF-8,WINDOWS-1251,${foo})});
Попробуйте использовать другую переменную для уже перекодированного:

Код: Выделить всё

Set(iconv=${ICONV(UTF-8,WINDOWS-1251,${foo})});

Re: шум в строке... ICONV

Добавлено: 01 апр 2015, 09:14
1g0r
Это было первое что я попробовал ) Строка такая же корявая.

Re: шум в строке... ICONV

Добавлено: 01 апр 2015, 09:36
virus_net
покажите лог исполнения диалплана

Re: шум в строке... ICONV

Добавлено: 01 апр 2015, 11:30
1g0r
Кусок диалплана
NoOp(=================================================================);
Set(foo=парам пам пам);
Set(foo=${foo}[cut]);.
NoOp(foo=${foo});
Set(foo=${ICONV(UTF8,CP1251,${foo})});
NoOp(foo=${foo});
Set(foo=${CUT(foo,"[cut]",1)});
NoOp(foo=${foo});
NoOp(========================= END ===================================);[/code]




Отработака диалплана

Код: Выделить всё

    -- Executing [7971@FROM_PRI:1] NoOp("DAHDI/i1/1070-3808", "=================================================================") in new stack
    -- Executing [7971@FROM_PRI:2] Set("DAHDI/i1/1070-3808", "foo=парам пам пам") in new stack
    -- Executing [7971@FROM_PRI:3] Set("DAHDI/i1/1070-3808", "foo=парам пам пам[cut]") in new stack
    -- Executing [7971@FROM_PRI:4] NoOp("DAHDI/i1/1070-3808", "foo=парам пам пам[cut]") in new stack
    -- Executing [7971@FROM_PRI:5] Set("DAHDI/i1/1070-3808", "foo=ࡰ᪠࡬ ࡬[cut]᪠࡬ ࡬") in new stack
    -- Executing [7971@FROM_PRI:6] NoOp("DAHDI/i1/1070-3808", "foo=ࡰ᪠࡬ ࡬[cut]᪠࡬ ࡬") in new stack
    -- Executing [7971@FROM_PRI:7] Set("DAHDI/i1/1070-3808", "foo=ࡰ᪠࡬ ࡬") in new stack
    -- Executing [7971@FROM_PRI:8] NoOp("DAHDI/i1/1070-3808", "foo="ࡰ᪠࡬ ࡬"") in new stack
    -- Executing [7971@FROM_PRI:9] NoOp("DAHDI/i1/1070-3808", "========================= END ===================================") in new stack

Re: шум в строке... ICONV

Добавлено: 02 апр 2015, 08:24
virus_net
1g0r писал(а):Set(foo=${ICONV(UTF8,CP1251,${foo})});
Все же UTF-8.

Вот исполнение этого dialplan`а на Asterisk 1.8, сделал скрин т.к. консоль в KOI8-R:
ast.iconv.jpg
Был UTF-8, а потом стал CP1251. Если вывод копипастнуть в файлик и установить кодировку CP1251, то "парам пам пам" отчетливо читаются:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
ast.iconv2.jpg
ast.iconv3.jpg
Без каких либо "шумов". Посему вопрос: вы точно уверены что изначальный текст у вас в UTF ?

А если вы в командной строке выполняете iconv ? А если через system ? Результат тот же ?

Re: шум в строке... ICONV

Добавлено: 02 апр 2015, 08:40
1g0r
В системной консоли шумов Нет.
Iconv -l говорит что применимы и UTF8 и Utf-8