【问题标题】:Unknown charset accented characters convert to utf8未知字符集重音字符转换为 utf8
【发布时间】:2020-11-08 12:16:10
【问题描述】:

我有一个网站,用户可以输入重音字符搜索词。 由于用户可能来自不同的国家、不同的操作系统,他们输入的字符集重音字符可能编码为 windows-1252、iso-8859-1,甚至是 iso-8859-X、windows-125X。

我正在使用 Perl,我的索引服务器是 Solr 8,所有数据都是 utf8。 如果源字符集已知,我可以使用 decode+encode 进行转换,但是如何将未知的重音转换为 utf8?如何在 Perl 中检测源重音字符的字符集?

use utf8;
use Encode;
encode("utf8",decode("cp1252",$input));

【问题讨论】:

    标签: perl utf-8 character-encoding


    【解决方案1】:

    网页和表单需要指定UTF-8。

    然后浏览器可以接受任何脚本,并将其以 UTF-8 格式发送到服务器。

    表单的编码可防止浏览器发送 HTML 实体,如 ă 以获取特殊字符。

    标题:

    Content-type: text/html; charset=UTF-8
    

    使用 perl(标题结尾为空行):

    print "Content-Type: text/html; charset=UTF-8\n\n";
    

    HTML 内容;在 HTML 5 中:

    <!DOCTYPE html>
    <html>
        <meta charset="UTF-8">
    ...
    <form ... accept-charset="UTF-8"
    

    【讨论】:

    • 非常感谢!你救了我的命! form accept-charset="UTF-8" 是我错过的。
    • 我从 chrome 用户那里收到了“Sch%F6ttl”(ISO-8859-1,Schöttl)的输入,而不是“Sch%C3%B6ttl”(UTF-8),知道吗?我已经在 Content-type 和 meta 中有 charset=utf-8 和 accept-charset="UTF-8"。
    • 请忽略,我认为“Sch%F6ttl”可以通过他自己的直接链接发送,但不能通过我的搜索表单提交。
    • 注意:在任何情况下,您都应该接受您可能会得到错误的编码。许多网络蜘蛛(但可能是某些浏览器,可能只是复制粘贴)可能会忽略您的建议。
    • 有点晚了,但你是对的:客户端错误。可以验证从翻译 %XX 接收到的byte[],然后在它不是 UTF-8 时回退到 Windows-1252,即 MS Latin-1,浏览器使用而不是 ISO-8859-1。 (即使是 Mac 浏览器也会这样解释 ISO-8859-1,并且由于指定了 HTML 5。)ISO-8859-1 是 HTTP 默认值,并且可能被错误地使用。可以轻松测试违反 UTF-8 的一致性。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2018-11-23
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    相关资源
    最近更新 更多