首页 > 解决方案 > CSV 文件中的匈牙利语/保加利亚语字符最终在 PHP 中出现乱码

问题描述

我正在尝试导入一个看起来像这样的 CSV 文件:

“源”、“目的地”

férfi-/ruházat-Öltöny,"férfi-/ruházat-blézer_zakó",

请注意,这只是 CSV 的一个示例,而不是整个 CSV。

我阅读文件的方式非常简单:

$line = fgets($this->fileHandle) ;
$line = mb_convert_encoding($line , 'UTF-8', mb_detect_encoding($line));

where$this->fileHandle只是一个指向使用fopen. 所以那里没什么特别的。

我想对 CSV 中的字符串进行一些字符串操作。我可以很好地导入它。

当我从文件中读取时,无论是使用fgetsfread还是我能想到的任何其他函数,如果我最终得到乱码文本。

类似这样的东西:

在此处输入图像描述

到目前为止,我已经尝试过mb_internal_encoding("UTF-8"), toISO-8859-2和其他一些编码。没有任何效果。

我也试过从 csv 读取的行在mb_convert_encoding($line , 'UTF-8', mb_detect_encoding($line))哪里。$line再次,什么都没有。还是乱码。

接下来我假设它可能来自我的操作系统。我在 Ubuntu 上使用带有 docker 实例的 MAC。

在 mac 上使用 High Sierra v10.13.4

locale终端中的命令给了我:

LANG="C.UTF-8"
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL= 

至于 docker 实例:

Distributor ID: Ubuntu
Description:    Ubuntu 14.04.5 LTS
Release:    14.04
Codename:   trusty

# locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=

所以在这方面一切似乎都很好。


我还尝试了一个在线 PHP 解释器,效果很好。很明显,问题就在我这边。

老实说,我不知道问题出在哪里。

非常感谢任何指向正确方向的人。

标签: phpcsvcharacter-encoding

解决方案


回答我自己的问题:

我不得不ini_set("default_charset", "UTF-8");。默认值为空字符串。

到目前为止,我不知道没有它它是如何工作的,我认为它有某种后备编码。

无论哪种方式,我希望这可以帮助其他陷入困境的人。


推荐阅读