Kors Опубликовано 29 декабря, 2014 Жалоба Поделиться Опубликовано 29 декабря, 2014 В файле simpla/ImportAdmin.php для определения кодировки загружаемого файла используется код $teststring = file_get_contents($source, null, null, null, 1000000); if (preg_match('//u', $teststring)) // Кодировка - UTF8 { Встретилась ситуация, когда загружался файл более 1М в кодировке UTF-8. В этом случае приведенный код определяет кодировку неверно.Если изменить на $teststring = file_get_contents($source, null, null, null); if (preg_match('//u', $teststring)) // Кодировка - UTF8 { то ошибка исчезает.До конца не понял приведенный код.Кто-то может объяснить действие модификатора u в preg_match('//u', $teststring) в приведенном примере или дать ссылку на объяснения? Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 29 декабря, 2014 Жалоба Поделиться Опубликовано 29 декабря, 2014 Читаем матчасть http://webew.ru/posts/1836.webew Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 30 декабря, 2014 Автор Жалоба Поделиться Опубликовано 30 декабря, 2014 Приведенная ссылка ничего не дает по существу поставленного вопроса.Имелся в виду вопрос о том, что возвращает вызов функции preg_match('//u', $teststring)В вызове регулярное выражение ПУСТОЕ, и поэтому вроде бы по смыслу всегда должно возвращать truе.Если знаете ТОЧНО, сообщайте. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 30 декабря, 2014 Жалоба Поделиться Опубликовано 30 декабря, 2014 Регулярное выражение - пустое. Но там присутствует модификатор u (PCRE_UTF8).И после PHP 4.3.5 он проверяет валидность UTF-8. И поэтому если строка не валидна utf-8 - вернет false Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 30 декабря, 2014 Автор Жалоба Поделиться Опубликовано 30 декабря, 2014 Регулярное выражение - пустое. Но там присутствует модификатор u (PCRE_UTF8).И после PHP 4.3.5 он проверяет валидность UTF-8. И поэтому если строка не валидна utf-8 - вернет false А ссылочку с подробностями не дадите? И как он проверяет? У меня был файл 1,5М в UTF-8. Из него прочитали начальную строку длиной 1М. Для этой строки применялось preg_match('//u', $teststring). Вроде бы должно определить UTF-8, а этого не произошло. Файл импорта обычный, довольно однородный, русских символов везде много. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 30 декабря, 2014 Жалоба Поделиться Опубликовано 30 декабря, 2014 http://php.net/manual/ru/reference.pcre.pattern.modifiers.php Я обычно так проверяю: if(preg_match('/^./us', $teststring) == 1){ //utf-8 } Попробуй, может поможет. Самый точный способ будет через mb_detect_encoding. Но не на всех сервах стоит расширение... А вообще лучше бы глянуть на проблемный файл... Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 30 декабря, 2014 Автор Жалоба Поделиться Опубликовано 30 декабря, 2014 Ваше условие не помогает, результат тот же. Сделал простенький тест, когда берется начальная строка разной длины: // Узнаем какая кодировка у файла for ($i=700;$i<800 ;$i++) { $teststring = file_get_contents($source, null, null, null, $i); echo "len=$i -". (preg_match('//u', $teststring) ? 'UTF-8' : 'NO UTF-8')." <BR>"; }; В результате дает определение UTF-8 примерно через раз.Если обрезка проходит по середине двухбайтового символа, как раз и не проходит валидация... А такое условие preg_match('//u', $teststring) || preg_match('//u', substr($teststring, 0, strlen($teststring)-1)) правильно определяет. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 30 декабря, 2014 Жалоба Поделиться Опубликовано 30 декабря, 2014 Уберите ограничения с file_get_contents. $teststring = file_get_contents($source);и тогда if(preg_match('//u', $teststring)) будет нормально работать... Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 30 декабря, 2014 Автор Жалоба Поделиться Опубликовано 30 декабря, 2014 Я про это еще в первом посте писал...Хотелось понять логику.Спасибо Вам за помощь и подсказку про валидацию. Я ведь Вашу ссылку раньше смотрел, но пропустил этот момент... Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.