代码之家  ›  专栏  ›  技术社区  ›  mmattax

帮助正确编码字符

  •  1
  • mmattax  · 技术社区  · 14 年前

    我有一个HTML表单,有时会提交带有重音符号:,¨,,

    我有一个php脚本,可以将这些表单提交导出为csv格式,当我在文本编辑器(例如vim或记事本)中查看csv格式时,字符看起来很好,但是当使用open office或word打开时,我会得到一些有趣的结果:_______

    我还将这些提交给Salesforce,得到一个错误:“引用了实体“atilde”,但没有声明。”

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

    我的html文件是content type设置为:content type:text/html;charset=utf-8 数据以拉丁语-瑞典语-ci排序方式存储在mysql中。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Søren Løvborg    14 年前

    完全编码混乱!-)

    表字符集

    mysql表字符集只决定mysql应该在内部使用什么编码,从而决定允许的字符范围。

    • 如果你设置成拉丁语-1(又名 ISO 8859-1 ),您将无法在表中存储国际字符。
    • 重要的是,字符集不会影响mysql在与php脚本通信时使用的编码。
    • 桌子 校勘 指定排序规则。

    连接字符集

    MySQL connection character set 确定在中接收表数据的编码(并应在中向mysql发送数据)。

    • 使用集合名称设置编码,例如。 SET NAMES "utf8" .
    • 如果这与表编码不匹配,mysql会自动动态转换数据。
    • 如果这与页面字符集不匹配,则必须在php中使用例如 utf8_encode mb_convert_encoding .

    页面字符集

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

    • 当您从浏览器中保存文件时,它不会作为http头保存。因此,openoffice或其他程序无法获得这些信息。

    建议

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

    但是,csv将导致问题,因为文件格式不包括编码信息。因此,由应用程序来猜测编码,正如您所看到的,猜测将是错误的。

    • 我不知道openoffice,但是microsoft office会采用windows的“ansi”编码,通常是拉丁语-1(或者 CP1252 具体来说)。
    • Microsoft Office也会在 countries that use "," as a decimal separator ,因为Office随后切换到使用“;”作为CSV文件的字段分隔符。

    最好的办法是对csv文件使用拉丁语-1。不过,我仍然会在表和连接字符集中使用utf-8,在html页面中也会使用utf-8。

    如果对连接字符集使用utf-8(通过执行 设置名称“utf8” 连接后),您需要通过utf8解码运行文本以转换为拉丁语-1。

    实体问题

    我还将这些提交给Salesforce,得到一个错误:“引用了实体“atilde”,但没有声明。”

    这听起来像是在XML上下文中传递HTML代码,与字符集无关。试着把课文通读一遍 html_entity_decode .

        2
  •  0
  •   Sarfraz    14 年前

    另外,您设置了什么文档类型,是吗?

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    

    尝试使用 htmlentities() 函数处理任何未正确显示的文本。

    您可能还想看看php Normalizer .

        3
  •  0
  •   Mark    14 年前

    确保将csv文件编写为utf-8。见 http://www.php.net/manual/en/function.fwrite.php#55054 如果你不确定怎么做。

    (另外,sql表应该使用utf8,而不是latin1)

        4
  •  0
  •   leonbloy    14 年前

    由您决定将使用哪种字符集编码来编写csv文件(但是,请注意,这必须是您的一个简洁的决定)。

    使用哪种字符集编码?csv没有定义字符集编码,所以我会选择一些unicode字符集,大概是utf8。但一些csv用户(如excel)可能并不满意它。如果您仅限于“西方”语言,那么Latin1或其变体(ISO-8859-1或ISO-8859-15)可能更合适。但是(无论如何,实际上)您必须考虑从用户输入到特定编码的转换,以及如果有无效字符该怎么办。

    (顺便说一句:HTML输入到DB的转换也要考虑同样的问题——你在数据库中使用Latin1,你有没有问过自己,如果用户键入一个非Latin1字符会发生什么情况?例如日本煤焦?).