Перейти к содержанию
Официальный форум поддержки Simpla

Определение кодировки файла при импорте


Рекомендуемые сообщения

В файле 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) в приведенном примере или дать ссылку на объяснения?

Ссылка на сообщение
Поделиться на другие сайты

Приведенная ссылка ничего не дает по существу поставленного вопроса.

Имелся в виду вопрос о том, что возвращает вызов функции 

preg_match('//u', $teststring)

В вызове регулярное выражение ПУСТОЕ, и поэтому вроде бы по смыслу всегда должно возвращать truе.

Если знаете ТОЧНО, сообщайте.

Ссылка на сообщение
Поделиться на другие сайты

Регулярное выражение - пустое. Но там присутствует модификатор u (PCRE_UTF8).

И после PHP 4.3.5 он проверяет валидность UTF-8. И поэтому если строка не валидна utf-8 - вернет false

Ссылка на сообщение
Поделиться на другие сайты

Регулярное выражение - пустое. Но там присутствует модификатор u (PCRE_UTF8).

И после PHP 4.3.5 он проверяет валидность UTF-8. И поэтому если строка не валидна utf-8 - вернет false

 

А ссылочку с подробностями не дадите?

 

И как он проверяет?  У меня был файл 1,5М в UTF-8.  Из него прочитали начальную  строку длиной 1М. Для этой строки применялось preg_match('//u', $teststring).  Вроде бы должно определить UTF-8, а этого не произошло. Файл импорта обычный, довольно однородный, русских символов везде много.

Ссылка на сообщение
Поделиться на другие сайты

http://php.net/manual/ru/reference.pcre.pattern.modifiers.php

 

Я обычно так проверяю:



if(preg_match('/^./us', $teststring) == 1){
//utf-8
}

Попробуй, может поможет. 

Самый точный способ будет через mb_detect_encoding. Но не на всех сервах стоит расширение... 

А вообще лучше бы глянуть на проблемный файл...

Ссылка на сообщение
Поделиться на другие сайты

Ваше условие не помогает, результат тот же.

 

Сделал простенький тест, когда берется начальная  строка разной длины:

		// Узнаем какая кодировка у файла
		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))

правильно определяет. 

Ссылка на сообщение
Поделиться на другие сайты

Уберите ограничения с file_get_contents.

 

$teststring = file_get_contents($source);
и тогда if(preg_match('//u', $teststring)) будет нормально работать...

 

Ссылка на сообщение
Поделиться на другие сайты

Я про это еще в первом посте писал...

Хотелось понять логику.

Спасибо Вам за помощь и  подсказку про валидацию.  Я ведь Вашу ссылку раньше смотрел, но пропустил этот момент...

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...