Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> некорректная работа substr и mb_substr с бинарника, ми 
:(
    Опции темы
Acraft
Дата 3.9.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 19.4.2005

Репутация: 1
Всего: 2



Доброго времени суток.
Возникла следующая проблема

из потока получаем данные: 
Код

$data = file_get_contents("php://input");

По протоколу согласно которому обрабатываются эти данные, строка представляет собой смесь строковых (utf-8) и бинарных последовательностей, часть которых подлежит преобразованию функцией unpack()
Код

$p=2;  
$size=unpack("L", substr($data,$p,4));   // В таком dword поле хранится информация о длине следующего за ним поля
$p+=4;
/* в нашем случае, substr или mb_substr, результат одинаков */

Другая часть вырезается из строки "как есть" и вставляется в файл (изображение). 
Код

$str = substr($data, $p, $size);
$p+=$size;

И третья часть представляющая собой обычную строку в кодировке utf-8
Код

// обрабатывается как и предыдущaя часть
$str = substr($data, $p, $size);


Проблема заключается в том, что в PHP 5.2.6 функции mb_substr() и substr() некорректно вырезают часть данных, если эти данные имеют хоть один символ кириллицы, не закодированный в UTF8.
Из-за этого этими функциями невозможно вырезать нужный кусок из бинарных данных.
Этого бага нет в версии PHP 5.2.5 и 4.4.1 

p.s.: вариант через fopen читать фрагменты нужной длинны не подходит

PM MAIL   Вверх
Sannis
Дата 4.9.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

Репутация: 6
Всего: 13



Цитата(Acraft @  3.9.2008,  23:37 Найти цитируемый пост)
если эти данные имеют хоть один символ кириллицы, не закодированный в UTF8.


Цитата(Acraft @  3.9.2008,  23:37 Найти цитируемый пост)
По протоколу согласно которому обрабатываются эти данные, строка представляет собой смесь строковых (utf-8) и бинарных последовательностей

Или вы себе противоречите, или неточно выразились.

С юникодом нужно использовать только mb_* функции. Я бы на вашем месте привёл весь код и пример файла smile

Добавлено через 1 минуту и 8 секунд
Да, а нужно ли вообще обрабатывать бинарные данные с помощью PHP?


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
Acraft
Дата 5.9.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 19.4.2005

Репутация: 1
Всего: 2



Простое описание, ниже будет еще особенность:
Код

$str="testабв"; //строка в Win1251
echo substr($str,0,5);

выводит: testабв, а должен testа

а вот это, естественно, работает:
Код

$str=iconv("Win1251","UTF8","testабв"); //строка в UTF
echo substr($str,0,5);

выводит: testа

и
Код

$str=iconv("Win1251","UTF8","testабв"); //строка в UTF
echo mb_substr($str,0,5);

выводит: testа

Проблема в том, что в его проекте $str содержит бинарные данные, например, тело JPG файла. И, если в этом теле есть хоть одна русская буква, то substr() из такой строки $str возвращает не то, что его просят.

И вот особенность- баг наблюдается только тогда, когда позиция, начиная с которой надо вернуть строку, находится после хотябы одной русской буквы, т.е.:
Код

$str="testабв"; //строка в Win1251
echo substr($str,0,3);

выводит: tes

а вто это:
Код

$str="testабвtest"; //строка в Win1251
echo substr($str,8,3);

выводит: строку из космоса, а должен: est

В php.ini прописано mbstring.internal_encoding = UTF-8
----

Еще раз напомню- в версиях PHP 5.2.5, 5.1.6, 4.4.1 бага нет, т.е. в указанных версиях
Код

$str="testабв"; //строка в Win1251
echo substr($str,0,5);

выводит: testа

P.S.:
Сегодня из портов установили патч php5-5.2.6_2. Первые тесты показали отсутствие проблемы.

Это сообщение отредактировал(а) Acraft - 5.9.2008, 10:38
PM MAIL   Вверх
Acraft
Дата 16.9.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 19.4.2005

Репутация: 1
Всего: 2



PM MAIL   Вверх
chiv
Дата 23.9.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.9.2008

Репутация: нет
Всего: нет



У меня такая же проблема функицией substr.
Причем возникает периодически 2-3 раза в сутки. Все файлы в Win1251.

На хостинге PHP 5.2.6
Кто нибудь знает как обойти эту проблему?
Можно использовать какую-нибудь другую функцию?

Это сообщение отредактировал(а) chiv - 23.9.2008, 16:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.