【问题标题】:Get non-UTF-8-form fields as UTF-8 in PHP?在 PHP 中将非 UTF-8 格式的字段作为 UTF-8 获取?
【发布时间】:2010-10-07 08:12:50
【问题描述】:

我有一个以非 UTF-8 格式提供的表单(实际上是在 Windows-1251 中)。当然,人们会在那里发布他们喜欢的任何角色。浏览器有助于将 unpresentable-in-Windows-1251 字符转换为 html 实体,因此我仍然可以识别它们。例如,如果用户键入 →,我会收到 →。这部分很棒,例如,如果我只是回显它,浏览器无论如何都会正确显示 →。

问题是,我实际上在显示之前对文本做了一个 htmlspecialchars()(这是一个将特殊字符转换为 HTML 实体的 PHP 函数,例如 & 变为 &)。我的用户有时会输入—© 之类的内容,而我想将它们显示为实际的—©,而不是- 和©。

我无法区分 → 和 →,因为我把它们都当作 →。而且,由于我 htmlspecialchars () 文本,我还从浏览器中获得了一个 → 的 →,我回显了一个 →,它在浏览器中显示为 →。所以用户的输入被破坏了。

有没有办法说:“好的,我在 Windows-1251 中提供此表单,但是请把输入的 UTF-8 发送给我,让我自己处理” ?

哦,我知道将整个软件切换到 UTF-8 是个好主意,但这工作量太大,我很乐意快速解决这个问题。如果这很重要,表单的 enctype 是“multipart/form-data”(包括文件上传器,因此不能使用任何其他 enctype)。我使用 Apache 和 PHP。

谢谢!

【问题讨论】:

    标签: php html utf-8 webforms


    【解决方案1】:

    浏览器有助于将 unpresentable-in-Windows-1251 字符转换为 html 实体

    嗯,差不多,只是它一点用都没有。现在你无法区分真正的“ƛ”有人键入并期望它以带有“&”和“Б”字符的文本字符串形式出现。

    我实际上在显示之前对文本做了一个htmlspecialchars()

    是的。您必须这样做,否则您会遇到安全问题。

    好的,我在 Windows-1251 中提供此表单,但请您将输入的 UTF-8 发送给我,让我自己处理

    是的,假设您在表单标签中发送“accept-charset="UTF-8"”。但现实情况是,这在 IE 中不起作用。要获取 UTF-8 格式的表单,您必须发送 UTF-8 格式的表单(页面)。

    我知道最好将整个软件切换到 UTF-8,

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

    【讨论】:

    • 是的 .. 即使您在内部使用了一些劣质的字符串表示,也请务必以 UTF-8 显示页面并进行转换。
    【解决方案2】:
    <form action="action.php" method="get" accept-charset="UTF-8">
        <!-- some elements -->
    </form>
    

    所有浏览器都应该以accept-charset 中指定的编码返回值。

    【讨论】:

    【解决方案3】:

    您检查字符是否在特定范围内。如果它们超出标准 UTF-8 字符的范围,请随心所欲地使用它。我会通过查看每个字符 &、#、8、5、9、4 来做到这一点,并将其解析为您可以应用的东西。

    找不到有人创建了 Windows-1251 到 UTF-8 转换脚本的地方,您可能不得不自己动手。您可能必须查看每个特定角色,看看需要对它做什么。如果它类似于 ©您将希望以不同于 → 的方式处理它因为第二个里面有#。

    我认为这回答了你的问题。

    【讨论】:

      【解决方案4】:

      html_entity_decode 函数可能就是你想要的。

      【讨论】:

        【解决方案5】:

        您可以将htmlspecialchars functiondouble_encode,自 PHP 5.2.3 起)的第四个参数设置为 false,这样可以避免再次对字符引用进行编码。

        或者你首先解码那些现有的字符引用。

        【讨论】:

          【解决方案6】:

          您可以使用 PHP multi-byte functions 将字符串转换为 UTF-8。从那里你可以做你想做的事。尤其是 mb_convert_encoding() 将其从 windows-1251 移动到 UTF-8 或其他任何位置。

          我不太明白你的问题,因为如果有人输入 &作为文本字符串,当您执行 htmlspecialchars() 时应将其转换为 &amp; ...当通过html_entity_decode() 运行返回时,它将作为用户输入的文本字符串出现。

          当然,如果您在通过htmlspecialchars() 运行字符串时没有使用double_encode 选项

          【讨论】:

            【解决方案7】:

            mbstring 支持“字符集”HTML 实体

            for($i=0; $i

            61 20 E2 86 92 20 62 20 26 20 63
            E2 86 92 是 utf8 中 → (RIGHTWARDS ARROW) 的字节序列。

            【讨论】:

              【解决方案8】:

              您将无法区分将代码点转换为实体的浏览器和您输入实体的用户,因为它们看起来相同。真正的解决方案是放弃 Windows 1251。取而代之的是,以 UTF-8 提供网页和表单,要求使用 UTF-8 编码,所有这些问题都会消失。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-09-14
                • 1970-01-01
                • 2012-06-01
                • 2011-03-16
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多