【发布时间】:2019-12-31 09:23:48
【问题描述】:
我正在尝试使用我的工具将 CSV 行转换为字符串 - 它用于注册多个用户 - 但每次我在我的 CSV 文件中使用变音符号 (ěščřž) 编写名字/姓氏并使用我的工具将每一行转换为字符串时, 这些字符显示为奇怪的字符 Ø
我尝试了 utf8_encode($item) 和 mb_convert_encoding($item, 'UTF-8')。它根本没有用。 Iconv 返回“检测到输入字符串中的非法字符”
{
array_walk_recursive($row, function(&$item) {
//Convert encoding to UTF-8 if its not UTF-8
if(!mb_detect_encoding($item, 'utf-8', true)){
$item = iconv(mb_detect_encoding($item), 'utf-8', $item);
}
});
return $row;
}
mb_detect_encoding 在这些上返回 FALSE(就像它无法确定编码一样) - 但仅在使用像“Příjmení”这样的变音符号时。如果我写“Prijmeni”,那么 mb_detect_encoding 成功检测到编码为 UTF-8。
当我输入行“Řádek;Příjmení;Příjmení;Test;mail@mail.com”时,我期望输出数组
[0] => "Řádek"
[1] => "Příjmení"
[2] => "Příjmení"
[3] => "Test"
[4] => "mail@mail.com"
但是使用上面描述的代码,它返回数组
[0] => "Øádek"
[1] => "PØíjmení"
[2] => "PØíjmení"
[3] => "Test"
[4] => "mail@mail.com"
我将 CSV 文件读取为 splFileObject,编码为 UTF-8。如果我将它插入到 db 中,它与我描述的相同(Øádek ; Pøíjmení)(但这不是强制性的,我从 CSV 获取数据,而不是从数据库获取数据,)
感谢您提供解决此问题的任何想法
【问题讨论】:
-
我怀疑你在使用
utf8_encode()和mb_detect_encoding()时并不知道它们的用途。以编程方式自动检测文件的编码基本上是不可能的,这就解释了为什么 PHP 没有内置函数。 -
如果您不知道用户文本的字符编码,那么您已经丢失了数据。也许您可以在时间上逆流/返回到丢失之前的某个点,然后继续往下走。
标签: php csv encoding utf-8 diacritics