php - 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 中的字符串进行一些字符串操作。我可以很好地导入它。
当我从文件中读取时,无论是使用fgets
,fread
还是我能想到的任何其他函数,如果我最终得到乱码文本。
类似这样的东西:
到目前为止,我已经尝试过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 解释器,效果很好。很明显,问题就在我这边。
老实说,我不知道问题出在哪里。
非常感谢任何指向正确方向的人。
解决方案
回答我自己的问题:
我不得不ini_set("default_charset", "UTF-8");
。默认值为空字符串。
到目前为止,我不知道没有它它是如何工作的,我认为它有某种后备编码。
无论哪种方式,我希望这可以帮助其他陷入困境的人。
推荐阅读
- isis - 如何在两个实体之间实现布局
- coldfusion - 如何只翻译文本框的内容?
- php - 在无库存管理员通知电子邮件中编辑产品链接
- loops - 哪个更惯用:dotimes vs loop repeat?
- android - 如何正确使用“blob”和“formdata”?
- wpf - 为什么我需要在绑定中指定 ElementName 和 DataContext?
- apache-spark - 将 sparklyr 与 Hadoop 一起使用时出现权限错误
- .net - 如何让 NET Core 授权工作
- kotlin - Kotlin:查找列表的最大日期列表
- laravel - 使用 API 和隐藏响应的最佳方式是什么