【问题标题】:What encoding is the resulting string if I concatenate a UTF-8 encoded string with an ASCII string in PHP?如果我在 PHP 中将 UTF-8 编码的字符串与 ASCII 字符串连接起来,生成的字符串是什么编码?
【发布时间】:2019-06-22 21:38:32
【问题描述】:

如果我使用函数mb_convert_encoding()将PHP中的ASCII编码字符串转换为UTF-8字符串,然后将其与ASCII编码字符串连接起来,它是什么编码?这样做有什么负面影响吗?

【问题讨论】:

    标签: php encoding utf-8 ascii data-conversion


    【解决方案1】:

    这首先取决于您是否指的是strict ASCII,它只包含 128 个字符。这些字符中的每一个在 ASCII 编码方案中都具有与 UTF-8 encoding scheme 中完全相同的编码。对于这些字符,mb_convert_encoding 函数将不起作用。您可以使用此脚本轻松验证这一点:

    /* Convert ASCII to UTF-8 */
    for ($i=0; $i<128; $i++) {
            $str1 = chr($i);
            $str2 = mb_convert_encoding($str1, "UTF-8", "ASCII");
    
            echo $str1 . " - " . $str2 . " - ";
    
            if ($str1 !== $str2) {
                    echo " - DIFFERENT!";
            } else {
                    echo " - same";
            }
            echo "\n";
    }
    

    对于所有这些 true ASCII 字符,对它们进行转码是没有意义的。

    但是,如果您所说的“ASCII”是指扩展的 ASCII(请参阅here)并且正在谈论带有重音符号和其他内容的字符,那么您会遇到麻烦因为该术语没有描述明确的字符集。您会注意到,在list of supported character encodings for php's Multibyte String extension 中,首字母缩略词 ASCII 仅出现一次,即 ASCII 本身。

    更准确地回答您的问题:

    如果我使用函数 mb_convert_encoding() 将 PHP 中的 ASCII 编码字符串转换为 UTF-8 字符串,然后将其与 ASCII 编码字符串连接,它是什么编码?

    结果字符串是both ASCII UTF-8,因为这两种编码方案对这 128 个字符使用相同的字节编码。

    这样做有什么负面影响吗?

    如果字符实际上是 true ASCII 字符,在任何情况下都不应该有负面后果。

    另一方面,如果字符串包含一些重音字符,如 Åõ 并且一些草率的编码人员将其称为“扩展 ASCII”,那么您可能会遇到问题.例如,这些字符在 latin-1 和 UTF-8 编码方案中具有不同的编码。

    考虑看一下这个 php 函数,它可能会失去一些理解。问问自己将非 ASCII 字符从 ASCII 转换为 UTF-8 意味着什么。这不是有意义的转换,但确实会导致此特定脚本发生变化:

    $chars = array("Å", "õ");
    foreach ($chars as $char) {
            echo $char . " : ";
            $str1 = mb_convert_encoding($str1, "UTF-8", "ASCII");
            $str2 = mb_convert_encoding($str1, "UTF-8", "ISO-8859-1");
            echo $str1 . " - " . $str2 . " - ";
    
            if ($char !== $str1) {
                    echo " - ASCII DIFFERENT";
            }
            if ($char !== $str2) {
                    echo " - LATIN 1 DIFFERENT";
            }
            echo "\n";
    }
    

    此时您可能会开始感到困惑。知道我在最后一个函数中的 PHP 代码有自己的字符编码,这可能对您有所帮助,在我的工作站上恰好是 utf-8。因此,我执行的这些转换非常愚蠢。我对 PHP 撒谎,说这些 UTF-8 字符串是 ASCII 或 Latin-1,并要求 PHP 将它们转换为 UTF-8。它尽其所能执行转换,但我们都知道转换没有意义。

    我希望你能欣赏我在这里所得到的。每次您在计算机上看到一个字符时,它都有一些编码。是否有任何负面后果将取决于您如何处理提供给您的数据、您对其执行的转换以及您以后打算如何处理这些数据。

    考虑监管链会很有帮助。你的数据是从哪里来的?他们使用了什么编码?那是我在我的系统上使用的吗?我在哪里发送这些数据?是否需要转换?您还应该注意为所有这些内容指定字符集:

    • 您从客户那里收到的数据
    • 向您的网站提交表单
    • 在您的网站上显示 html
    • 对应用程序中文本字符串的操作
    • 与数据库的连接的字符编码、数据库中表的字符编码以及这些表中列的编码
    • 存储数据的字符编码
    • 电子邮件字符编码
    • 提交给 API 的数据的字符编码

    等等。

    一般经验法则:尽可能使用 utf-8。

    【讨论】:

    • 感谢您的详细解释!
    • 很高兴我能帮上忙。
    【解决方案2】:

    ASCII 是 UTF-8 的子集,因此 ASCII 字符串是有效的 UTF-8 字符串。连接两个 UTF-8 字符串是明确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-11
      • 2011-08-09
      • 2016-10-01
      • 2011-08-16
      • 2014-06-09
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多