代码之家  ›  专栏  ›  技术社区  ›  Ilya Birman

在PHP中将非UTF-8格式字段获取为UTF-8?

  •  1
  • Ilya Birman  · 技术社区  · 16 年前

    我有一个非UTF-8格式的表单(实际上是Windows-1251)。当然,人们可以在那里张贴他们喜欢的任何角色。浏览器将Windows-1251中不可预知的字符转换为html实体,这样我仍然可以识别它们。例如,如果用户键入,我将收到 →

    & ).我的用户有时会键入以下内容 — © ,我希望将它们显示为实际值 — &

    对我来说,没有办法区分 → → . 而且,由于我对文本进行了htmlspecialchars()处理, & 对于from浏览器,我回显 → 显示为 → 在浏览器中。因此,用户的输入被破坏。

    有没有一种说法:好的,我在Windows-1251中提供此表单,但会 请将UTF-8中的输入发送给我,让我自己处理好吗?

    哦,我知道将整个软件切换到UTF-8是个好主意,但是这太多工作了,我很乐意得到一个快速修复。如果这很重要,那么表单enctype是“多部分/表单数据”(包括文件上传程序,因此不能使用任何其他enctype)。我使用Apache和PHP。

    谢谢

    8 回复  |  直到 16 年前
        1
  •  3
  •   bobince    16 年前

    浏览器可帮助将Windows-1251中不可预知的字符转换为html实体

    实际上,在显示文本之前,我对文本执行了htmlspecialchars()

    对你必须这么做,否则你就有安全问题了。

    我知道把整个软件换成UTF-8是个好主意,

    是的。嗯,至少包含表单的页面的编码应该是UTF-8。

        2
  •  1
  •   Georg Schölly Crazy Developer    16 年前
    <form action="action.php" method="get" accept-charset="UTF-8">
        <!-- some elements -->
    </form>
    

    accept-charset .

        3
  •  0
  •   helloandre    16 年前

    检查字符是否在特定范围内。如果它们不在标准UTF-8字符的范围内,请使用它执行任何操作。我会通过查看每个角色来实现这一点&,#,8、5、9、4,并将其解析为可以应用的内容。

    如果找不到有人创建了Windows-1251到UTF-8转换脚本的地方,您可能不得不自己动手。您可能需要查看每个特定的角色,看看需要对其执行哪些操作。如果是像&复制您将希望以与&不同的方式处理它#8594; 因为第二个里面有#。

        4
  •  0
  •   user42092 user42092    16 年前
        5
  •  0
  •   Gumbo    16 年前

    htmlspecialchars function ( double_encode ,从PHP 5.2.3)到 错误的 请避免再次对字符引用进行编码。

    或者首先对现有的字符引用进行解码。

        6
  •  0
  •   null    16 年前

    multi-byte functions . 从那里你可以随心所欲。尤其是 mb_convert_encoding()

    htmlspecialchars() 这将把它转换为&amp;amp。。。当它通过一个 html_entity_decode() 将显示为用户输入的文本字符串。

    double_encode htmlspecialchars()

        7
  •  0
  •   VolkerK    16 年前

    for($i=0; $i<strlen($out); $i++) { printf('%02X ', ord($out[$i])); }

    E2 86 92 20 62 20 26 20 63
    E2 86 92是utf8中–†(向右箭头)的字节序列。
        8
  •  0
  •   staticsan    16 年前

    您将无法区分浏览器将代码点转换为实体和用户键入实体,因为它们看起来完全相同。真正的解决办法是放弃Windows1251。相反,用UTF-8提供网页和表单,要求UTF-8编码,所有这些问题都应该消失。