【问题标题】:How do you know what encoding the user is inputing into the browser?你怎么知道用户在浏览器中输入了什么编码?
【发布时间】:2010-12-30 02:32:23
【问题描述】:

我阅读了Joel's article about character sets,因此我采纳了他的建议,在我的网页和数据库中使用 UTF-8。我无法理解的是如何处理用户输入。正如 Joel 所说,“在不知道它使用什么编码的情况下拥有一个字符串是没有意义的。”但是我怎么知道用户输入字符串使用什么编码呢?如果我有

<input type="text" name="atextfield" >

在我的页面上,我如何知道我从用户那里获得了什么编码?如果用户输入一些特殊的 ASCII 符号,比如 ♣ 或 ™ 之类的会怎样?有什么方法可以检测到用户输入给了我一些 UTF-8 无法识别的东西?处理这类事情有什么标准吗?

【问题讨论】:

  • ASCII 没有像 ♣ 或 ™ 这样的特殊符号。它只有 128 个字符,其中一些是控制字符。具有这些符号的是 UTF-8。

标签: php html encoding utf-8


【解决方案1】:

检查HTTP headers 以发现字符编码。

【讨论】:

    【解决方案2】:

    如果您的网页使用 UTF-8,浏览器将为您转换为 UTF-8。因此,即使是特殊字符也是 ASCII 格式,它也会以 UTF-8 格式提交。

    但是,您永远不会知道将页面编码切换回 ISO-8859-* 的用户手痒。

    您可以在 mb_detect_encoding 上使用,但不是 100% 防弹。

    /* Detect character encoding with current detect_order */
    echo mb_detect_encoding($str);
    
    /* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
    echo mb_detect_encoding($str, "auto");
    
    /* Specify encoding_list character encoding by comma separated list */
    echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");
    
    /* Use array to specify encoding_list  */
    $ary[] = "ASCII";
    $ary[] = "JIS";
    $ary[] = "EUC-JP";
    echo mb_detect_encoding($str, $ary);
    

    【讨论】:

      【解决方案3】:

      不要尝试检测,在您的应用程序中将所有用户输入的文本转换为 UTF-8。你可以尽你所能,通过配置你的网络服务器发送 UTF-8 页面和 UTF-8 标头,配置你的应用程序以处理 UTF-8 中的所有文本,调整你的文件系统(如果需要)来处理文本文件UTF-8,配置你的数据库,但你对用户端没有真正的控制权。您可以在 html 表单中建议正确的字符编码,如下所示,但在用户端并不能真正强制执行:

      <form action="/index.php" method="post" accept-charset="UTF-8"></form>
      

      除非检测用户输入的编码是您的应用程序的全部目的,否则尝试这是愚蠢的差事。假设编码错误并在您的应用程序中将其转换为 UTF-8。正如您应该假设您的用户输入是恶意的,并在尝试将其插入数据库之前对其进行清理。

      在大多数正确实现了 UTF-8 的语言中,ASCII 字符在转换后仍然可以保存,所以也不必担心。

      【讨论】:

      • "假设编码错误并在您的应用程序中将其转换为 UTF-8。"但是您不能从“错误”转换为 UTF-8,您必须从其他特定编码转换为 UTF-8。因此,如果您的页面以 UTF-8 提供并且您没有得到 UTF-8,那么如果您不想进行完整的编码检查,那么您可能无能为力,即使这些也不是 100% 保证的。
      • 我不明白你对我的评论有什么问题,因为你基本上是在说我所说的。您是正确的,您无法绝对确定随机用户输入的编码方式。但是当您将用户输入插入数据库时​​,编码确实是您遇到的最少问题。您真正能做的就是将其转换为 UTF-8 并希望获得最好的结果,因为您需要清理潜在的 SQL 注入代码以及其他更重要的事情要做。另外,由于这不是 1996 年,大多数浏览器和操作系统都支持 UTF-8 编码,所以这都是学术性的。
      • 所以我只能接受这样一个事实,即如果有人提交的不是 UTF-8 的内容,就会出现乱码?
      • 差不多,是的。除非你想让自己发疯,试图找到一种方法来 100% 准确地检查每个帖子的编码。但这就是互联网的本质:高度容忍失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多