使用PHP的unicode字符串的explosion()来获取数组中的行


using PHP explode() of a unicode string to get the rows in an array

我试图读取一个制表符分隔的电子表格与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
}