如何区分 PHP 中的 MacRoman 和 Windows-1251 编码?
Posted
技术标签:
【中文标题】如何区分 PHP 中的 MacRoman 和 Windows-1251 编码?【英文标题】:How to differentiate between MacRoman and Windows-1251 encodings in PHP? 【发布时间】:2011-04-26 18:19:53 【问题描述】:我现在正在抓头发几天。我用谷歌搜索和*** 很多都没有成功。
我正在从 csv 文件导入一些数据。此 CSV 文件是在 Windows 或 Mac 上的 Excel 中生成的,它提供了 2 种不同的编码“Windows-1251”和“MacRoman”。两者都是 ISO-8859-1 的变体,mb_detect_encoding 没有帮助:它总是检测我放入列表中的第一个编码。
例如:
mb_detect_encoding($buffer, 'macroman, windows-1251, UTF-8');
会给出“宏指令”。
使用相同的字符串,尝试:
mb_detect_encoding($buffer, 'windows-1251, macroman, UTF-8');
将给出“window-1251”。
那么你怎样才能正确地做出改变呢?我需要将我的输入字符串(csv 文件内容)转换为 utf-8 以插入数据库。
也许我错过了什么?你们通常如何设法解析csv文件,并将数据正确保存在DB(utf8)中。
感谢您提供任何线索!
【问题讨论】:
你从哪里得到这个 csv 文件?如果来自站点 - 也许在标题中声明的字符集?如果手动上传 - 也许可以在上传之前更改文件的编码? 您的数据实际上是否包含任何非纯 ascii(高于 0x7F 的字符代码)的内容,或者您实际上是否有一个 ISO-8859-1 字符和另一个有西里尔文? 我不会信任 mb_detect_encoding() 并允许用户选择数据源。根据数据文件中的内容,mb_detect_encoding() 可能会也可能不会产生好的结果。 该文件的 Windows 版本是通过电子邮件发送给我的,当我在 Textmate 中打开它时,它告诉我它是 ISO-8859-1。如果我打开我自己在 Mac 上生成的版本,它会告诉我 MacRoman。到现在为止还挺好。数据主要包含 ISO-8859-15 字母(法语字母如 éèêàùôç...)。然后我将文件上传到我的 webapp 并尝试转换为 utf8。 utf8_encode 适用于文件的 windows 版本, iconv('MacRoman', 'UTF-8', $fileContent) 适用于 Mac 版本。到目前为止,感谢您的 cmets。 【参考方案1】:我认为确保正确处理此问题的唯一方法是首先定义保存 csv 文件的过程。然后你只需要 utf8_encode 进来的东西就可以了......
【讨论】:
保存 csv 文件的过程?你的意思是在创建它时,还是在将它保存在 Web 服务器文件系统上时?对于前者,我不能指望我的客户能正确地做到这一点,但我可以将自己的文件保存在 latin1 中,你如何从 Excel 中做到这一点? (我有 Excel Mac 2008) 我的意思是,在 mac 上创建文件的人应该始终“另存为 windows csv 文件”或类似的东西,以确保编码是一致的。 我已经很长时间没有玩这个了,但是我们在没有(不可靠的)mb_detect_encoding() 的情况下将 csv 导入到 db 工作正常,只使用 fgetcsv() 和 utf8_encode()。 基本上,我的意思是没有好的自动化方法来找出我们面临的编码,所以我们需要告诉用户“确保你输出这种编码,否则所有的地狱都会崩溃”;) 谢谢,我想这是最务实的解决方案。当你问你的客户“确保......”时,你知道它是多么“不可靠”,但是嘿,我别无选择;)以上是关于如何区分 PHP 中的 MacRoman 和 Windows-1251 编码?的主要内容,如果未能解决你的问题,请参考以下文章
有个问题想明确的人出来解释一下WiFi有没有关于4G和5G的区分?
区分开发和生产环境的 PHP 中的打包、缓存、JS 和 CSS