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

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

ru
Offline Offline

« : 24-06-2013 22:56 » new

Доброго времени суток, уважаемые форумчане. Просьба объяснить, почему так происходит.

Код: (Javascript)
 var input = 't=impr&itck=25nDoQ5CUWcp7IqT_XDoRw4jT6WKzFJ87NVssQoPck2nw4cCmZUTR1crcUrb_Q3hZsLvg-BnM9kmrbzwGRlgjYANpMRzREBfycJQnm5kQnFkjsJgi3ILN-mNYETW5hcDUkbUpxK_VKKoEZEWnI9OYPuAk1dcrLruwbUfk2Jv7HrUYQczRMeI0zjVTjdXCmTYirk-oG4yiRNHgzuUC_zmE5EonefUbCvnLoG9p0ziKotwYtnQsR7N68u7m7ke7-uQY5NFr4HDMI394EjkhESmc23fSExJmcwr9oDPr2t6kYqL9tLv3GO3jP_5LXne4p1dSuioTl_Q5tLj1bIaZC3KGuNpn-hCUFwBFPGsk7qGkqityRrFCD-4MoTAw6c291TycMtol-7ZczBJHQ';

        var i = 0;
        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
           
            document.write (chr3 + "\t" + "\n")
       
        }

Разультат работы (отлаживал вот тут jsfiddle.net)

105 114 116 61 110 81 85 112 113 88 82 106 87 70 55 115 111 107 119 67 85 49 99 98 51 115 103 110 107 98 71 103 65 77 82 102 74 109 81 107 74 51 78 78 84 104 85 85 75 75 69 87 57 80 107 99 114 98 107 118 114 81 82 73 106 106 67 89 107 71 105 72 117 95 69 111 102 67 76 57 122 111 89 81 55 56 109 101 117 53 114 68 51 69 104 109 51 69 109 114 68 50 107 76 76 71 106 53 110 112 83 111 95 116 49 97 51 117 110 67 119 80 107 71 105 82 67 52 84 54 57 121 116 45 99 74 NaN

Обратите внимание, на последнее значение в конце...

То же самое, но на перле
105     114     116     61      110     81      85      112     113     88
82      106     87      70      55      115     111     107     119     67
85      49      99      98      51      115     103     110     107     98
71      103     65      77      82      102     74      109     81      107
74      51      78      78      84      104     85      85      75      75
69      87      57      80      107     99      114     98      107     118
114     81      82      73      106     106     67      89      107     71
105     72      117     95      69      111     102     67      76      57
122     111     89      81      55      56      109     101     117     53
114     68      51      69      104     109     51      69      109     114
68      50      107     76      76      71      106     53      110     112
83      111     95      116     49      97      51      117     110     67
119     80      107     71      105     82      67      52      84      54
57      121     116     45      99      74 Use of uninitialized value  in print at C:\s.pl line 12.

В чем дело???
« Последнее редактирование: 24-06-2013 23:02 от perl6 » Записан
Finch
Спокойный
Администратор

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


« Ответ #1 : 25-06-2013 01:21 » 

 А можно увидеть перловый вариант программы?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
perl6
Помогающий

ru
Offline Offline

« Ответ #2 : 25-06-2013 01:52 » 

А можно увидеть перловый вариант программы?

Конечно, я сам что то сразу не допер его выложить

Код: (Perl)
#!/usr/bin/perl -w

  $tmp = 't=impr&itck=25nDoQ5CUWcp7IqT_XDoRw4jT6WKzFJ87NVssQoPck2nw4cCmZUTR1crcUrb_Q3hZsLvg-BnM9kmrbzwGRlgjYANpMRzREBfycJQnm5kQnFkjsJgi3ILN-mNYETW5hcDUkbUpxK_VKKoEZEWnI9OYPuAk1dcrLruwbUfk2Jv7HrUYQczRMeI0zjVTjdXCmTYirk-oG4yiRNHgzuUC_zmE5EonefUbCvnLoG9p0ziKotwYtnQsR7N68u7m7ke7-uQY5NFr4HDMI394EjkhESmc23fSExJmcwr9oDPr2t6kYqL9tLv3GO3jP_5LXne4p1dSuioTl_Q5tLj1bIaZC3KGuNpn-hCUFwBFPGsk7qGkqityRrFCD-4MoTAw6c291TycMtol-7ZczBJHQ';

        $i = 0;
        while ($i < length $tmp) {

           $chr1 = unpack("C*", substr($tmp, $i++));
           $chr2 = unpack("C*", substr($tmp, $i++));
           $chr3 = unpack("C*", substr($tmp, $i++));
           
                   print $chr3, "\t" }
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #3 : 25-06-2013 06:23 » 

Следует знать внутреннее устройство скаляра. Хотя бы то, что строка имеет кодировку, определяемую источником. Это может быть либо байтовая, либо символьная последовательность. Соотв., в разных случаях length вернет разные числа.

$ perl -wE 'use strict; my $a; use utf8; $a = "йцукен"; say length $a; use bytes; $a = "йцукен"; say length $a;'
6
12

Исходить надо из смысла программы. Из самой программы он не ясен.

И не ясно, что тебя возмущает. JS точно также недоволен твоим алгоритмом, разница только в реакции: chr() выдал NaN, а unpack() выдал undef. Распечатать undef никак нельзя.
« Последнее редактирование: 25-06-2013 06:30 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #4 : 28-06-2013 09:01 » 

Доброго всем дня. Приношу извинения, что сразу не отписался, практика сейчас, а кругом шаромыги - пошел в четверг одного нет, в пятницу - подписи не хватает. В общем двое суток не спал толком, вот что.  Жаль

Следует знать внутреннее устройство скаляра. Хотя бы то, что строка имеет кодировку, определяемую источником. Это может быть либо байтовая, либо символьная последовательность. Соотв., в разных случаях length вернет разные числа.

А откуда жабаскрипт знает, с чем ей работать, с потоком байтов, с строкой в utf кдировке??? Подавал на вход в отладчике что угодно, всегда - NaN. Соотв., легко проверить функцией isNaN  С ума сойти...

$ perl -wE 'use strict; my $a; use utf8; $a = "йцукен"; say length $a; use bytes; $a = "йцукен"; say length $a;'
6
12

Проверить не получилось, на винде актив перл старый, вываливает ошибки...

Исходить надо из смысла программы. Из самой программы он не ясен.

А смысл простой - подобрать эквивалент жабаскриптовой функции
Код: (Javascript)
charCodeAt
для utf-8 строки

Может на cpan - e есть какие нибудь либы для работы со строками?

И не ясно, что тебя возмущает. JS точно также недоволен твоим алгоритмом, разница только в реакции: chr() выдал NaN, а unpack() выдал undef. Распечатать undef никак нельзя.
Смущает то, что жабаскрипт всегда выдает NaN, что легко проверяется выщеуказанной функцией. Perl же, как ни странно, при исп. ord вываливает 0, вместо NaN, а при исп. более гибкого unpack - undef или, что чаще, просто пустое значение...
« Последнее редактирование: 28-06-2013 09:12 от perl6 » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #5 : 28-06-2013 09:54 » 

А откуда жабаскрипт знает, с чем ей работать, с потоком байтов, с строкой в utf кдировке???

Функции JS не различают многобайтные символы — только однобайтные. Perl различает.

Проверить не получилось, на винде актив перл старый, вываливает ошибки...

На работе ты тоже будешь жаловаться, что у тебя что-то не то?

Исходить надо из смысла программы. Из самой программы он не ясен.

А смысл простой - подобрать эквивалент жабаскриптовой функции
Код: (Javascript)
charCodeAt
для utf-8 строки

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

Может на cpan - e есть какие нибудь либы для работы со строками?

Готовых ответов на CPAN нет. Единственный способ решить задачу — это читать книги/мануалы и думать, думать и еще раз думать. А когда есть сомнения, что правильно понял, надо ставить эксперимент.

Прежде чем использовать какую-либо функцию, внимательно прочитай мануал по ней. Не первые две строчки, а полностью.
http://perldoc.perl.org/functions/ord.html
http://perldoc.perl.org/functions/unpack.html
http://perldoc.perl.org/perlpacktut.html

И язык, если ты его собираешься применять, надо учить, а не думать, что ты его знаешь.
« Последнее редактирование: 28-06-2013 10:19 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #6 : 28-06-2013 10:11 » 

А откуда жабаскрипт знает, с чем ей работать, с потоком байтов, с строкой в utf кдировке???

Функции JS не различают многобайтные символы — только однобайтные. Perl различает.

Проверить не получилось, на винде актив перл старый, вываливает ошибки...

На работе ты тоже будешь жаловаться, что у тебя что-то не то?

Исходить надо из смысла программы. Из самой программы он не ясен.

А смысл простой - подобрать эквивалент жабаскриптовой функции
Код: (Javascript)
charCodeAt
для utf-8 строки

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

Может на cpan - e есть какие нибудь либы для работы со строками?

Готовых ответов на CPAN нет. Единственный способ решить задачу — это читать книги/мануалы и думать, думать и еще раз думать. А когда есть сомнения, что правильно понял, надо ставить эксперимент.

Прежде чем использовать какую-либо функцию, внимательно прочитай мануал по ней. Не первые две строчки, а полностью.
http://perldoc.perl.org/functions/ord.html
http://perldoc.perl.org/functions/unpack.html

И язык, если ты его собираешься применять, надо учить, а не думать, что ты его знаешь.

Ну ты, Ром, как всегда только бы наехать. Представь, ты пришел в спортзал, а там мужики 200 кило выжимают. А ты с пердежом 20 еле отрываешь. Тебя сразу же станут чморить, что в итоге? Рамплакавшись, ты бросаешь тяжелую атлетику и засаживаешься за перл... В конце - слабое зрение, геморройные шишки и спина дугой...
По твоему я не решил эту задачу в приемлимых для меня вариантах? Сижу вот тут вот и жду, когда добрые дяди мне все сделают???

P.S. Ты наводку дай, зацепку, по простому, как сам понимаешь. А читать я с 1 класса умею, иначе бы даже примеров навалять не смог)))

P.P.S. Если бы все могли учиться по учебникам, то кругом были бы сплошные Ломоносовы и Циалковские... А кругом - пьянь, да рвань...
« Последнее редактирование: 28-06-2013 10:12 от perl6 » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #7 : 28-06-2013 10:19 » 

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

Показываю последний раз. Дальше либо хорошо думаешь, либо не спрашивай.

$ perl -we 'use strict; use utf8; my $str = "1234йцук"; print join(" ", map { ord $_ } split //, $str), "\n";'
49 50 51 52 1081 1094 1091 1082
$ perl -we 'use strict; use bytes; my $str = "1234йцук"; print join(" ", map { ord $_ } split //, $str), "\n";'
49 50 51 52 208 185 209 134 209 131 208 186

Заметь, что ord работает. Не работает только если не читать документацию. Кстати, кривая спина и больная попа — атрибут не знаний, а лени. И задачу надо ставить корректно.
« Последнее редактирование: 28-06-2013 10:24 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #8 : 28-06-2013 10:30 » 

Спасибо, посидим, подумаем. В принципе, я немного извратившись, решил задачу, но временами бывает косячит, хочется уж если не идеального решения, то хотя бы - правильного с точки зрения перлового синтаксиса.

Че то под виндой не робит твой пример. У меня руки не из того места растут?  А черт его знает...  Не понял

C:\>perl -we "use strict; use utf8; my $str = "1234йцук"; print join(" ", map {
ord $_ } split //, $str), "\n";"
Malformed UTF-8 character (unexpected non-continuation byte 0xf6, immediately af
ter start byte 0xe9) at -e line 1.
Unrecognized character \x{0}; marked by <-- HERE after str = 1234<-- HERE near c
olumn 37 at -e line 1.

Попробовал запустить на vds, вот, что выдает

root@akirakurosava:~# perl -we 'use strict; use utf8; my $str = "1234"; print join(" ", map { ord $_ } split //, $str), "\n";'
49 50 51 52

perl -we 'use strict; use bytes; my $str = "1234"; print join(" ", map { ord $_ } split //, $str), "\n";'
49 50 51 52

Перл на сервере стандартный, из портов, сам не компилировал из исходников. В чем же дело???

root@akirakurosava:~# perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi
(with 80 registered patches, see perl -V for more detail)

Copyright 1987-2011, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
« Последнее редактирование: 28-06-2013 10:47 от perl6 » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #9 : 28-06-2013 10:49 » 

Конечно, под виндой utf8 в консоли хрен введешь. Для экспериментов можно сделать виртуалку (VirtualBox, VmWare) с установленной системой по вкусу. Я примерно так и делаю.

Это был пример кодировки символов строки: прагмы use utf8 и use bytes указывали, как трактовать кодировку символьных констант, встречающихся в тексте. Чтобы избежать неоднозначности ответа ord на нулевой символ и на пустую строку, просто не запускай его с пустой строкой. Кстати, пример очень даже в духе perl: каскад операций: режем, преобразуем, склеиваем, печатаем.


Добавлено через 2 минуты и 35 секунд:
Цитата
Перл на сервере стандартный, из портов, сам не компилировал из исходников. В чем же дело???

Удостоверься, что ты передаешь в командной строке именно utf8, а не другую кодировку. Проверь свой терминал. Я пользуюсь PuTTY.
Кстати, проверить можно как раз вариантом с use bytes: покажет коды твоих символов.
« Последнее редактирование: 28-06-2013 10:53 от RXL » Записан

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

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

« Ответ #10 : 28-06-2013 12:20 » 

Да можно в файл сохранить с кодировкой utf8 - хоть блокнотом. Зачем прям с консоли-то вводить?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

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

WWW
« Ответ #11 : 28-06-2013 15:43 » 

Однострочник нет смысла записывать в файл. А вот знать свое окружение и инструменты очень даже полезно.
Записан

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

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

WWW
« Ответ #12 : 28-06-2013 15:55 » 

C:\>perl -we "use strict; use utf8; my $str = "1234йцук"; print join(" ", map { ord $_ } split //, $str), "\n";"
Malformed UTF-8 character (unexpected non-continuation byte 0xf6, immediately after start byte 0xe9) at -e line 1.
Unrecognized character \x{0}; marked by <-- HERE after str = 1234<-- HERE near column 37 at -e line 1.

В чем же дело???

Дело в невнимательности к деталям. Читай текст ошибки, анализируй. Это весьма полезно.

В ошибке открытым текстом сказано, в чем проблема:

Цитата
Malformed UTF-8 character

Нечто, что нашел Perl, не соответствует формату UTF-8.

Цитата
unexpected non-continuation byte 0xf6, immediately after start byte 0xe9

Что такое 0xf6 и 0xe9? Это в кодировке CP1251 (windows-1251) символы «ц» и «й».

Цитата
Unrecognized character \x{0}; marked by <-- HERE after str = 1234<-- HERE

Ты же использовал двойные кавычки для оборачивания программы, но они используются и в самой программе. Что там в итоге получилось?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #13 : 28-06-2013 16:04 » 

Под виндой то понятно, но почему на дебиане не поперло. Я тоже пользуюсь putty, однако непонятна реакция перла
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #14 : 28-06-2013 16:18 » 

Загляни в настройки подключения:
1. Window/Translation/Character set translation on received data. По умолчанию там KOI8-U.
2. Window/Appearance/Font settings. Должен быть выбран шрифт с поддержкой юникода (а не Terminal, поддерживающий только OEM).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #15 : 28-06-2013 16:22 » 

Все поставлено нормально  Класс!, utf-8 в настройках сразу ставлю, иначе в mc кракозябры
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #16 : 28-06-2013 16:39 » 

У тебя проблема есть. У меня проблемы нет. А черт его знает...

Уточни:

Цитата
my $str = "1234";

Тут ты вводил «1234йцук»?
« Последнее редактирование: 28-06-2013 16:42 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #17 : 28-06-2013 16:43 » 

Да, вогнал все в перловый файл, сохранил блокнотом в кодировке utf-8, убрал строгий режим и предупреждения - все пашет (в винде)... Будем думать дальше  Здесь была моя ладья...

C:\>d.pl
49 50 51 52 1081 1094 1091 1082

C:\>d.pl
49 50 51 52 208 185 209 134 209 131 208 186
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #18 : 28-06-2013 17:00 » 

А смысл простой - подобрать эквивалент жабаскриптовой функции
Код: (Javascript)
charCodeAt
для utf-8 строки

В итоге, задача решена?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #19 : 28-06-2013 17:13 » 

Не совсем. Задача решается, скажем так.  Скромно так...
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #20 : 05-07-2013 06:45 » 

По части ssh и PuTTY:

На сервере в sshd.conf:
AcceptEnv LANG

В настройках подключения PuTTY, в «Connection/Data/Envinonment variables» можно определить, например, «LANG=ru_RU.UTF-8»
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines