【问题标题】:using PHP explode() of a unicode string to get the rows in an array使用 unicode 字符串的 PHP explode() 来获取数组中的行
【发布时间】:2015-09-21 09:05:50
【问题描述】:

我正在尝试使用这样的 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 Богдан дорога Санкт-Петербург 3174 45 Андрей Смирнов маркетинг 234-56790 653-23685 dummy@dummy.com 34354547

爆炸后的一行是这样的:

R002 ! B C 4 8 O 2 66 > 3 4 0 = 4 > @ > 3 0 ! 0 = : B -¬ 5 B 5 @ 1 C @ 3 3174 45 = 4 @ 5 9 ! 2

编辑:子字符串也不起作用

我还注意到另一个奇怪的行为。当我这样做时

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")?

【问题讨论】:

  • 显示您的内容和预期输出
  • 我现在添加了一个示例 :-)
  • 你的预期输出是什么
  • 嗨,预期的输出是,当我想打印基于换行符 (explode("\n",$content)) 展开的行 (echo $rows[1]) 时Unicode 字符与 $content 中显示的字符保持一致。最后每一行在验证后都会被插入到数据库中。

标签: php utf-8


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2018-10-15
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多