我有一个HTML表单,有时会用重音字符提交:à,è,ì,ò,ù
我有一个PHP脚本将这些表单提交导出为CSV格式,当我在文本编辑器(例如vim或记事本)中查看CSV格式时,字符看起来很好,但是当使用Open Office或Word打开时,我得到一些时髦的结果:
我也将这些提交传递给salesforce并收到错误:“实体”Atilde“被引用,但未被声明。”
如何确保CSV文件的可移植性?处理编码的正确方法是什么?
我的HTML文件内容类型设置为:Content-Type:text / html;字符集= utf-8的 数据作为latin1_swedish_ci collation存储在MySQL中。
答案 0 :(得分:3)
总编码混乱! : - )
MySQL表字符集仅确定MySQL应在内部使用的编码,从而确定允许的字符范围。
MySQL connection character set确定您接收表格数据的编码(并应将数据发送到MySQL)。
SET NAMES "utf8"
。使用Content-Type header指定的页面字符集告诉浏览器如何解释PHP脚本输出。
理想情况下,您应该在所有三个位置使用相同的编码,理想情况下,该编码应为UTF-8。
但是,CSV会导致问题,因为文件格式不包含编码信息。因此,应用程序可以猜测编码,正如您所见,猜测将是错误的。
最好的办法是将Latin-1用于CSV文件。我仍然使用UTF-8作为表和连接字符集,以及HTML页面的UTF-8。
如果您使用UTF-8作为连接字符集(通过在连接后执行SET NAMES "utf8"
),则需要通过utf8_decode运行文本以转换为Latin-1。
我也将这些提交传递给salesforce并收到错误:“实体”Atilde“被引用,但未被声明。”
这听起来像是在XML上下文中传递HTML代码,与字符集无关。尝试通过html_entity_decode运行文本。
答案 1 :(得分:0)
另外,你设置了什么文件类型,是吗?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
尝试将 htmlentities() 功能用于任何无法正确显示的文字。
您可能还想查看PHP Normalizer 。
答案 2 :(得分:0)
确保将CSV文件写为UTF-8。如果您不确定如何,请参阅http://www.php.net/manual/en/function.fwrite.php#55054。
(另外,你的sql表应该使用utf8,而不是latin1)
答案 3 :(得分:0)
由您决定使用哪种字符编码来编写CSV文件(但是,请注意,这一定是您自己的一个有意义的决定)。
使用哪种charset编码? CSV没有定义字符集编码 - 所以我会选择一些Unicode字符集,大概是UTF8。但是一些CSV消费者(例如Excel)可能对它不满意。如果您被限制为“西方”langs,那么latin1或其变体(iso-8859-1或iso-8859-15)可能更合适。但是(无论如何,实际上)你必须考虑从用户输入到特定编码的转换 - 以及如果存在无效字符该怎么办。
(顺便说一下:对于html-input-to-db转换也同样考虑 - 你正在使用latin1作为你的数据库,你问过自己如果用户输入一个非latin1字符会发生什么?例如日本字符?)