Файлы не в формате UTF8 (файл Google CSV) - PullRequest
1 голос
/ 27 января 2011

У меня возникают странные проблемы с кодировкой при обработке загруженных файлов.

Мне нужно принять любой текстовый файл и прочитать его содержимое. В частности, возникли проблемы с файлами, загруженными из экспорта контактов Google.

Я сделал обычный utf8_encode / decode, mb_detect_encoding и т. Д. Всегда возвращает, как если бы строка была UTF-8, и перепробовал много опций iconv, чтобы попытаться восстановить кодировку, но безуспешно.

test.php

header('Content-type: text/html; charset=UTF-8');

if ($stream = fopen($_FILES['list']['tmp_name'], 'r'))
{
    $string = stream_get_contents($stream);

    fclose($stream);
}

echo substr($string, 0, 50);
var_dump(substr($string, 0, 50));
echo base64_encode(serialize(substr($string, 0, 50)));

выход

��N�a�m�e�,�G�i�v�e�n� �N�a�m�e�,�A�d�d�i�t�i�o�n�
��N�a�m�e�,�G�i�v�e�n� �N�a�m�e�,�A�d�d�i�t�i�o�n�
czo1MDoi//5OAGEAbQBlACwARwBpAHYAZQBuACAATgBhAG0AZQAsAEEAZABkAGkAdABpAG8AbgAiOw==

Ответы [ 2 ]

3 голосов
/ 27 января 2011

В начале строки содержатся байты \ xFF \ xFE, которые представляют метку порядка байтов для UTF-16 Little Endian. Все буквы на самом деле являются двухбайтовыми последовательностями. В основном за \ 0 следует символ ASCII.

Печать их на консоли заставит клиент терминала правильно интерпретировать последовательности UTF-16. Но вам нужно вручную декодировать его (лучше всего через iconv), чтобы сделать весь массив отображаемым.

0 голосов
/ 27 января 2011

Когда я декодировал элемент base64, я увидел странную смешанную строку: s:50:"\xff\xfeN\x00a\x00m\x00e\x00,\x00G\x00i\x00v\x00e\x00n\x00 \x00N\x00a\x00m\x00e\x00,\x00A\x00d\x00d\x00i\x00t\x00i\x00o\x00n\x00". Часть после второй : является 2-байтовой строкой Unicode (UCS2), заключенной в ASCII ", тогда как "s" и "50" являются простыми ASCII. Эта \ff\fe часть является меткой порядка байтов строки UCS2. Это безумие, но можно разобрать.

Я полагаю, что вы разбили входную строку на :, обрезав " от начала и до конца и пытаясь декодировать каждую результирующую строку отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...