CSV文件中的匈牙利语/保加利亚语字符最终在PHP中出现乱码

时间:2019-04-18 06:27:52

标签: php csv character-encoding

我正在尝试导入看起来像这样的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));

$this->fileHandle只是指向使用fopen打开的文件的资源。所以那里没什么特别的。

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

当我使用fgetsfread或其他任何函数读取文件时,如果文本结尾出现乱码,我会认为。

与此类似:

enter image description here

到目前为止,我已经尝试了mb_internal_encoding("UTF-8")ISO-8859-2和其他一些编码。什么都没用。

我也尝试过mb_convert_encoding($line , 'UTF-8', mb_detect_encoding($line)),其中$line是从csv读取的行。 再说一遍。文本仍然乱码。

接下来,我认为这可能是操作系统中的问题。我在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解释器,并且效果很好。显然,问题就在我这边。

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

任何朝着正确方向指向的人都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题:

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

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

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