我正在尝试导入看起来像这样的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内的字符串进行一些字符串操作。我可以导入它。
当我使用fgets
,fread
或其他任何函数读取文件时,如果文本结尾出现乱码,我会认为。
与此类似:
到目前为止,我已经尝试了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解释器,并且效果很好。显然,问题就在我这边。
说实话,我不知道问题出在哪里。
任何朝着正确方向指向的人都会受到赞赏。
答案 0 :(得分:0)
要回答我自己的问题:
我不得不ini_set("default_charset", "UTF-8");
。默认值为空字符串。
到目前为止,我仍然不知道它如何工作,我认为它具有某种后备编码。
无论哪种方式,我都希望这可以帮助陷入困境的其他人。