我正在尝试使用这样的unicode字符读取制表符分隔的电子表格:
$content = file_get_contents($filename);
当我在浏览器中打印时,文本显示正确。还有一个标题:
header('Content-Type: text/html; charset=utf-8');
现在我想使用以下内容将内容拆分为行:
$rows= explode("\n",$content);
当我打印一行时,unicode字符的内容现在是乱码:
echo $rows[1];
我的问题是:是什么导致了这种行为,我该怎么做才能将正确的文本放入$ row数组?最后,我想将行值插入到数据库中,该数据库现在插入了乱码。
帮助赞赏
示例
explode()之前的一行看起来像这样(注意:标签不会显示在下面):
R002Студия2В66Богдан дорогаСанкт-Петербург317445АндрейСмирновмаркетинг234-56790653-23685 dummy@dummy.com 34354547
在爆炸之后,一行看起来像:
R002! B C 4 8 O 2 66> 3 4 0 = 4> @> 3 0! 0 =:B-¬5B 5 @ 1 C @ 3 3174 45 = 4 @ 5 9! < 8 @ => 2< 0 @:5 B 8 = 3 234-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 O 2 66> 3 4 0 = 4>
不确定这里发生了什么......是不是因为该文件包含utf-8 bom(“\ xEF \ xBB \ xBF”)?
答案 0 :(得分:1)
我找到了解决方案,必须使用它的编码。它是从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
}