非UTF8文件(Google CSV文件)

时间:2011-01-27 00:01:21

标签: php utf-8 character-encoding

处理上传文件时遇到了奇怪的编码问题。

我需要接受任何类型的文本文件,并能够阅读内容。特别是从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 个答案:

答案 0 :(得分:3)

字符串的开头带有字节\ xFF \ xFE,表示UTF-16 Little Endian的Byte Order Mark。所有字母实际上都是双字节序列。主要是前导\ 0后跟ASCII字符。

在控制台上打印它们将使终端客户端正确解释UTF-16序列。但是你需要手动解码它(最好通过iconv)以使整个数组可以显示。

答案 1 :(得分:0)

当我解码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"。第二个:之后的部分是用ASCII "括起来的2字节Unicode(UCS2)字符串,而“s”和“50”是纯ASCII。 \ff\fe段是UCS2字符串的字节顺序标记。这是疯狂但可以解析。

我认为您将输入字符串拆分为:,从开始和结束中删除"并尝试分别解码每个结果字符串。