帮助正确的字符编码

时间:2010-04-15 14:35:58

标签: php portability character-encoding

我有一个HTML表单,有时会用重音字符提交:à,è,ì,ò,ù

我有一个PHP脚本将这些表单提交导出为CSV格式,当我在文本编辑器(例如vim或记事本)中查看CSV格式时,字符看起来很好,但是当使用Open Office或Word打开时,我得到一些时髦的结果:

我也将这些提交传递给salesforce并收到错误:“实体”Atilde“被引用,但未被声明。”

如何确保CSV文件的可移植性?处理编码的正确方法是什么?

我的HTML文件内容类型设置为:Content-Type:text / html;字符集= utf-8的 数据作为latin1_swedish_ci collat​​ion存储在MySQL中。

4 个答案:

答案 0 :(得分:3)

总编码混乱! : - )

表格字符集

MySQL表字符集仅确定MySQL应在内部使用的编码,从而确定允许的字符范围。

  • 如果您将其设置为Latin-1(又名ISO 8859-1),您将无法在表格中存储国际字符。
  • 重要的是,字符集不会影响MySQL与PHP脚本通信时使用的编码。
  • collat​​ion 指定排序规则。

连接字符集

MySQL connection character set确定您接收表格数据的编码(并应将数据发送到MySQL)。

  • 使用SET NAMES设置编码,例如SET NAMES "utf8"
  • 如果这与表格编码不匹配,MySQL会自动转换数据。
  • 如果这与您的页面字符集不匹配,则必须使用例如PHP在PHP中手动执行字符集转换。 utf8_encodemb_convert_encoding

页面字符集

使用Content-Type header指定的页面字符集告诉浏览器如何解释PHP脚本输出。

  • 作为HTTP标头,从浏览器中保存文件时不会保存。因此,OpenOffice或其他程序无法获取该信息。

推荐

理想情况下,您应该在所有三个位置使用相同的编码,理想情况下,该编码应为UTF-8。

但是,CSV会导致问题,因为文件格式不包含编码信息。因此,应用程序可以猜测编码,正如您所见,猜测将是错误的。

  • 我不了解OpenOffice,但Microsoft Office将采用Windows“ANSI”编码,这通常意味着Latin-1(或CP1252具体)。
  • Microsoft Office也会导致countries that use "," as a decimal separator出现问题,因为Office会切换到使用“;”作为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字符会发生什么?例如日本字符?)