Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кодировка UCS-2 не поддаётся  (Прочитано 45760 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Maksir
Постоялец

ru
Offline Offline

« : 27-01-2009 19:06 » 

Вот такая строка:
Код:
+CUSD: 0,"04110430043B0430043D0441003A0020003100300034002E0036003804400020",72
Это данные о балансе, представлены в кодировке UCS-2

iconv переводит всё в такой вид:
Код:
呁䌫单㵄ⰱㄪ㈰Ⱓ㔱䄍⭔佚剐㵔വ呁娫呓剁ൔ呁䌫䉐㵓匢≍䄍⭔偃卍

Не знаю, может я делаю что не так... В интернете искал, проги из исходников соберал, применял скрипты всякие, но результат тот же.
Код:
iconv -l | grep UCS-2
UCS-2\\
UCS-2BE\\
UCS-2LE\\

Вот сам скриптец:
Код:
#!/bin/bash
echo -e "AT+CUSD=1,*100#,15\r\n
AT+ZOPERTE=\"mts\"\r\n
AT+ZOPRT=5\r\n
AT+ZSTART\r\n
AT+CPBS=\"SM\"\r\n
AT+CPMS=\"SM\",\"SM\",\"\"\r\n">/dev/ttyUSB3
cat /dev/ttyUSB3 | iconv -f UCS-2 -t UTF-8

Встречал какие-то описания, что эти числа, это как бы восмиричное представление данных. Но вот, вопрос, может кто знает, где таблицу найти такую. Копался, не нашёл. Либо это кодировка вообще не та.
В некоторых моментах, было сообщение от iconv, что строка заканчивается некоретно... Словно, обрывается она нелогично.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 27-01-2009 19:47 » 

http://www.unicode.org/faq/basic_q.html#14

Цитата
Q: What is the difference between UCS-2 and UTF-16?

A: UCS-2 is what a Unicode implementation was up to Unicode 1.1, before surrogate code points and UTF-16 were added as concepts to Version 2.0 of the standard. This term should be now be avoided.

When interpreting what people have meant by "UCS-2" in past usage, it is best thought of as not a data format, but as an indication that an implementation does not interpret any supplementary characters. In particular, for the purposes of data exchange, UCS-2 and UTF-16 are identical formats. Both are 16-bit, and have exactly the same code unit representation.

The effective difference between UCS-2 and UTF-16 lies at a different level, when one is interpreting a sequence code units as code points or as characters. In that case, a UCS-2 implementation would not handle processing like character properties, codepoint boundaries, collation, etc. for supplementary characters.

http://ru.wikipedia.org/wiki/UTF-16

Там сказано, то это последовательность 16-битных чисел.

IMHO:

04110430043B0430043D0441003A0020003100300034002E0036003804400020
=
0x0411, 0x0430, 0x043B, 0x0430, 0x043D, 0x0441, 0x003A, 0x0020, 0x0031, 0x0030, 0x0034, 0x002E, 0x0036, 0x0038, 0x0440, 0x0020

Что по юникодной странице 0400 переводится как: "Баланс: 104.68р ".
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #2 : 27-01-2009 19:54 » 

RXLКак здорово! Улыбаюсь спасибо!
Записан
Maksir
Постоялец

ru
Offline Offline

« Ответ #3 : 27-01-2009 21:08 » 

RXL нашёл таблицу символов -- http://www.unicode.org/charts/PDF/U0400.pdf
но, вот, хотелось бы узнать, есть ли какой-нибудь доступный способ преобразования в нормальный вид?
Парсер думаю писать.. но, не изобретать же велосипед...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 28-01-2009 04:09 » 

Не понятно....
1. Преобразования чего?
2. Парсер чего?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 28-01-2009 06:00 » 

iconv преобразует в нормальный вид Улыбаюсь
Только вот есть дву вида кодирования UTF-16 и UCS-2
С прямым и обратным порядком байт (LE/BE), для того что бы автоматически определить какой порядок байт, в начале файла или сообщения ставят специальный флаг (0xFF 0xFE) или (0xFE 0xFF) (если не ошибаюсь) в зависимости от того что в начале FF или FE определяют как закодировано остальное сообщение, если нет префикса, то ... (хотя может в стандарте оговорено, я не читал Улыбаюсь )

iconv при перекодирование кодировании выбрал LE, но если сделать так:
Код:
iconv -f UCS-2BE
то проблема решается
« Последнее редактирование: 28-01-2009 06:08 от LogRus » Записан

Странно всё это....
Maksir
Постоялец

ru
Offline Offline

« Ответ #6 : 28-01-2009 08:14 » 

RXL да, в общем, не о чем... просто, я имел ввиду собрать вроде граблей, через команды. но, да и так всё ясно:

04110430043B0430043D0441003A002000370034002E0032003804400020

здесь написанно 74.28 Улыбаюсь

LogRus спасибо за ответ. всё понятно. но, чего-то, странным образом не получается.
Этот MTC... чтоб ему неладно было, sms присылает в кириллице...

Код:
#!/bin/bash
echo -e "AT+CUSD=1,*100#,15\r">/dev/ttyUSB3
cat /dev/ttyUSB3 | iconv -f UCS-2BE -t UTF-8

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

зю. может быть в локали нужно добавить чего...(?)
В Ubuntu, например, весь конфиг локали подключен... так, автоматически. когда обновлял, то видел в подробном выводе процесса обновляемых пакетов, установки, настройки, пересборки, ну и команду locale-gen и ... там список подключеных локалий полный
« Последнее редактирование: 28-01-2009 08:32 от Maksir » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 28-01-2009 08:24 » 

LogRus, как я понимаю, фишка тут в том, что исходные данные представляют из себя ASCII-текст из элементов формата "%04X". Т.е. сперва надо перевести текст в бинарное представление, а уж потом - iconv.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 28-01-2009 10:33 » 

RXL, аааа, ну я для таких целей можно быстренько набросать потоковый конвертер
Записан

Странно всё это....
Maksir
Постоялец

ru
Offline Offline

« Ответ #9 : 28-01-2009 14:11 » 

Подождите, может поделитесь идеями? я даже приблизительно не знаю, как это прикладным способом сделать... так как iconv посылает...
для меня это сложно пока.

у меня мысль - поделить строку ... каждый элимент массива сопоставить своему юникодному коду... Но, это же бред.. Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 28-01-2009 16:54 » 

Maksir, рассказывай Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #11 : 28-01-2009 21:12 » 

RXL вот на iconv всё и заканчивается... строку нужную нашёл, но смысл от этого не меняется. я хотел её поделить, да способ забыл... шпору не могу найти.
Дык, всё равно теряется смысл.. Вы тут говорили о бинарном представлении... а я не представляю как это делается.
Код:
#!/bin/bash
F="/dev/ttyUSB3"
echo -e "AT+CUSD=1,*100#,15\r">$F
grep "+CUSD:" $F | iconv -f UCS-2BE -t UTF-8
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 29-01-2009 05:06 » 

Пишем софтинку которая принимает на вход(stdin) строку, на выход(sdtout) hex код

потом ставим её в конвейер перед iconv и вуаля
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 29-01-2009 06:55 » 

Попробуй так:
Код:
echo '+CUSD: 0,"04110430043B0430043D0441003A0020003100300034002E0036003804400020",72' | \
  perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 29-01-2009 17:21 » 

я перла не знаю поэтому мне проще софтинку написать Улыбаюсь
Записан

Странно всё это....
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #15 : 29-01-2009 20:28 » 

LogRus, на пере тоже софтины пишутся Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Maksir
Постоялец

ru
Offline Offline

« Ответ #16 : 29-01-2009 22:31 » 

RXL, Спасибо! уже кое-что есть!
Короче, пока вот так:
Код:
#!/bin/bash
F="/dev/ttyUSB3"
#echo -e "AT+CUSD=1,*100#,15\r">$F
#cat $F > /home/00
#grep "+CUSD:" /home/00 > /home/01
cat /home/01 | \
perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null
echo ""
Приходится пока поэтапно переключать. Потому что bash подвисает на модеме. Там, постоянный поток, нужно ^C жать, прервывать задачу. Потом править файл на следующую инструкцию. У меня не получается составить условие таким образом, что бы после получения от модема нужной строки, прервать прослушивание порта. Так получается, что cat $F > /home/00 постоянно в цепи с файлом и не прерывает поток.
Пробовал прерывать связь с портом (с модемом) , но дело оказалось не в этом. Пробовал разное.. даже не знаю, как вообще задачу прервать... чтоб уже передать данные к строке perl
Код:
#echo -e "AT+ZSTOP\rAT+ZOPRT=6\r">$F

#esac
#exit 0
Вот это из вашего кода, наверное и есть прервать:
Код:
2>/dev/null
или, что эта строка значит?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #17 : 29-01-2009 22:34 » 

Это значит, что все сообшения об ошибках отправлять в нирвану.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 30-01-2009 07:07 » 

Maksir, Жаль
ты ведь не в первый раз видишь *nix like
2>/dev/null - это классика

ты же используешь, например
ps | grep bla-bla >log

stdin <
stdout >
stdterr 2>
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Maksir
Постоялец

ru
Offline Offline

« Ответ #19 : 30-01-2009 14:45 » 

Sla спасибо. я просто запутался. Вот, классика, там понятно что происходит. Но, в папке /dev , там вроде, как бы, устройства.. не догнал я. но, пока что, это не так важно.
теперь начинаю догонять.
а, как бы этот поток обойти, - cat $F > /home/00
Например, я создам фильтр, по признаку, мне нужно будет прервать задачу, но не весь сценарий. а у меня не получается... или голова не соображж... никак придумать не могу.
На C++, это, наверное было вот так - break и всё... далее следует... А у меня, в bash (вообще ничего не срабатывает) я даже прекратить процесс не могу. Это похоже, как соединение устанавливается с модемом. И сам процесс, сам по-себе пишит в этот файл сколько угодно... до тех пор, пока я не жахну 'ctrl + c'
я поищу ещё, как найду решение, выложу здесь.
В инете есть подобные скрипты, но мне попадались только те, которые компилировать надо. Код очень мудренный, знать надо... Не один из них у меня не заработал.
По этому, в bash удобнее. В нём всё предельно ясно. Если что, отладить можно в любой момент.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 30-01-2009 15:29 » 

навскидку
читать перлом поток по частям из $F
F="/dev/ttyUSB3"

т.е. весь сценарий написать на перле
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Maksir
Постоялец

ru
Offline Offline

« Ответ #21 : 30-01-2009 21:12 » 

Sla, меня очень заинтересовал уже этот perl Улыбаюсь

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

Решил задачку, пока сойдёт и так. Несовсем удачный метод, но, у меня работает.
Да, вполне логично, по-сути. Но не идеально пока.
Вот:
Код:
#!/bin/bash
F="/dev/ttyUSB3"
echo -e "AT+CUSD=1,*100#,15\r">$F
head -n 4 $F > /home/00
grep "+CUSD:" /home/00 > /home/01
cat /home/01 | \
perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null
echo ""
Может кому понадобится. Спасибо всем! Улыбаюсь
Пойду perl изучать.
Записан
Maksir
Постоялец

ru
Offline Offline

« Ответ #22 : 30-01-2009 22:11 » new

Вот ещё такой вариант;
Код:
#!/bin/bash
F="/dev/ttyUSB3"
echo -e "AT+CUSD=1,*100#,15\r">$F
head -n 4 $F | \
grep "+CUSD:" | \
perl -ne '@a = m/([0-9A-F]{4})/g; map { eval "print \"\\x{$_}\""; } @a;' 2>/dev/null
echo ""
Всё, теперь точно, - ушёл изучать perl... (меня здесь нет) Улыбаюсь
« Последнее редактирование: 31-01-2009 07:31 от Maksir » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 31-01-2009 05:33 » 

Стоит помнить, что устройства TTY - терминалы - работают иначе, чем обычные файлы. По логике они ближе к сокетам. Просто считать все из него (cat /dev/tty...) нельзя, т.к. конца файла нет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
gronqe
Гость
« Ответ #24 : 25-11-2009 13:20 » 

grep "+CUSD:" /home/00 > /home/01 - да уж наворотили
я для tele2 делал так:
cat /dev/ttyUSB2|grep -m1 CUSD|cut -f2 --delimiter=\"
grep -m1 останов после первого совпадения
а перекодировать там ничего не нужно
слово OCTATOK написано латиницей
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines