anonymous@RULINUX.NET~# Last login: 2024-04-25 09:53:17
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

А почему могут рваться пайпы, когда по ним шлют неюникодовые символы?

Для максимальной простоты приведу пример CGI приложения:

  1.  #!/bin/bash
  2.  echo "200 OK"
  3.  echo "Content-Type: text/plain; charset=UTF-8"
  4.  echo
  5.  echo
  6.  echo -e 'test\xC0\xC1\xC2' | iconv -f windows-1251
  7.  

Вместо iconv можно воткнуть sed 'y/\xC0\xC1\xC2/АБВ/', итог тот же. Так вот, если запусить пример из консоли как приложение, то получим итоговую строку testАБВ, как и ожидалось. Если же зайти по соотв. адресу через браузер (вебсервер никаких mod_ не содержит, тупо запускает CGI приложения через execl), то получим только test, а всё что написано дальше - не приходит, причём, в логах веб-сервера увидим что не приходит, т.к. само приложение дальше ничего и не говорило. Если вместо пайпов использовать временные файлы - всё работает. Если перенаправить вывод iconv в файл - увидим что при запуске через веб-сервер в файле только test и написано, а при запуске из терминала - вся строка.

which показывает что бинарники берутся одни и те же. Из подозрительного пока что вижу только различия в $TERM (xterm и dumb соотв., правда, export TERM="xterm" дело не меняет) и locale: соотв.

  1.  LANG=ru_RU.UTF-8
  2.  LANGUAGE=
  3.  LC_CTYPE="ru_RU.UTF-8"
  4.  LC_NUMERIC="ru_RU.UTF-8"
  5.  LC_TIME="ru_RU.UTF-8"
  6.  LC_COLLATE="ru_RU.UTF-8"
  7.  LC_MONETARY="ru_RU.UTF-8"
  8.  LC_MESSAGES="ru_RU.UTF-8"
  9.  LC_PAPER="ru_RU.UTF-8"
  10.  LC_NAME="ru_RU.UTF-8"
  11.  LC_ADDRESS="ru_RU.UTF-8"
  12.  LC_TELEPHONE="ru_RU.UTF-8"
  13.  LC_MEASUREMENT="ru_RU.UTF-8"
  14.  LC_IDENTIFICATION="ru_RU.UTF-8"
  15.  LC_ALL=
  16.  
и
  1.  LANG=
  2.  LANGUAGE=
  3.  LC_CTYPE="POSIX"
  4.  LC_NUMERIC="POSIX"
  5.  LC_TIME="POSIX"
  6.  LC_COLLATE="POSIX"
  7.  LC_MONETARY="POSIX"
  8.  LC_MESSAGES="POSIX"
  9.  LC_PAPER="POSIX"
  10.  LC_NAME="POSIX"
  11.  LC_ADDRESS="POSIX"
  12.  LC_TELEPHONE="POSIX"
  13.  LC_MEASUREMENT="POSIX"
  14.  LC_IDENTIFICATION="POSIX"
  15.  LC_ALL=
  16.  

Только вот не надо уходить от темы, говоря типа "сколько ненужностей itt", не о том речь сейчас, так что если нечего сказать - лучше пропустите. Гуглить не пробовал, ибо пока не совсем понятно даже какие слова подобрать. В общем, вопрос почему в первых условиях всё работает как задумано, а во вторых - ломается, причём, ломается только `|', а `>' и `

anonymous(*) (2011-07-01 01:29:00)

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

[Ответить на это сообщение]
avatar
Скрыть

Re: А почему могут рваться пайпы, когда по ним шлют неюникодовые символы?

> Только вот не надо уходить от темы
Это делает не пайп, а iconv потому что не знает во что ему преобразовывать твои символы. Припиши в конец команды " -t UTF-8" и я уверен твоя жизнь сразу же улучшится в полтора раза.

anonymous(*)(2011-07-01 01:43:56)

avatar
Скрыть

Re: А почему могут рваться пайпы, когда по ним шлют неюникодовые символы?

А если почитать stderr, что получится?

И да, анонимус выше абсолютно прав.

AITap(*)(2011-07-13 22:57:01)

Opera/19.2
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!