Перейти к содержимому


Фото
- - - - -

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


  • Чтобы отвечать, сперва войдите на форум
8 ответов в теме

#1 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 29.12.2014 - 20:10

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



#2 Noxter

Noxter
  • Забаненый
  • 1 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 29.12.2014 - 22:19

Читаем матчасть http://webew.ru/posts/1836.webew

#3 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 30.12.2014 - 08:38

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

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

preg_match('//u', $teststring)

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

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



#4 yr4ik

yr4ik
  • Фрилансер
  • 931 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Украина Чернигов

Опубликовано 30.12.2014 - 18:06

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

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



#5 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 30.12.2014 - 19:05

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

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

 

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

 

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



#6 yr4ik

yr4ik
  • Фрилансер
  • 931 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Украина Чернигов

Опубликовано 30.12.2014 - 19:31

http://php.net/manua...n.modifiers.php

 

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



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

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

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

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



#7 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 30.12.2014 - 20:01

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

 

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

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

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



#8 yr4ik

yr4ik
  • Фрилансер
  • 931 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Украина Чернигов

Опубликовано 30.12.2014 - 20:11

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

 

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

 



#9 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 30.12.2014 - 21:25

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

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

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






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых