我试图读取一个制表符分隔的电子表格与unicode字符像这样:
$content = file_get_contents($filename);
当我在浏览器中打印它时,文本显示正确。还有一个标题:
header('Content-Type: text/html; charset=utf-8');
现在我想通过使用
将内容分成几行$rows= explode("'n",$content);
现在,当我打印一行时,unicode字符的内容是乱码:
echo $rows[1];
我的问题是:是什么导致这种行为,我能做些什么来获得正确的文本到$row数组?最后,我想将行值插入到数据库中,该数据库目前正在插入胡言乱语。
帮助欣赏
在explosion()之前的一行看起来像这样(注意:下面没有显示制表符):
R002 Студия 2В 66 Богдандорога Санкт——Петербург3174 45АндрейСмирновмаркетинг234 - 56790 653 - 23685 dummy@dummy.com 34354547
爆炸后的一行如下:
R002 !B c 4 8 0 2 66> 3 4 0 = 4> @> 3 0 !0 =: b - 5 b@ 1 c @ 3 3174 45 = 4 @ 5 9 !& lt;8 @ => 2 <0 @: 5 b 8 = 3234-56790 653-23685 dummy@dummy.com 34354547 59
编辑:也子字符串不工作
我还注意到另一个奇怪的行为。当我做
echo mb_substr($content,0,50,'utf-8');
输出只有25个字符,但字符显示正确
R002 Студия 2В 66 Богдан
但是,当我将偏移量从0更改为例如5时,它又会变得一团糟。
echo mb_substr($content,5,50,'utf-8');
输出为
02 !B C 4 8 0 2 66> 3 4 0 = 4>
不知道这里发生了什么…可能是因为文件包含utf-8 bom("'xEF'xBB'xBF")吗?
我找到了解决方案,这必须与它的编码。它是从Excel导出的,这在一开始就有困难。无论如何,这是我的代码来解析编码位:
$data = file_get_contents($filename);
if (strpos($data, "'xef'xbb'xbf") !== FALSE)
{
//do nothing, it's already utf-8
}
elseif(strpos($data, "'xff'xfe") !== FALSE)
{
$data = iconv('UCS-2', 'UTF-8', $data); //LE UTF-16
}
elseif(strpos($data, "'xfe'xff") !== FALSE)
{
$data = iconv('UCS-2', 'UTF-8', $data); //BE UTF-16
}