使用unixode字符串的PHP explode()来获取数组

时间:2015-09-21 09:05:51

标签: php utf-8

我正在尝试使用这样的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”)?

1 个答案:

答案 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
}