繁体   English   中英

如果在PHP中将UTF-8编码的字符串与ASCII字符串连接起来,结果字符串将是什么编码?

[英]What encoding is the resulting string if I concatenate a UTF-8 encoded string with an ASCII string in PHP?

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

首先,这取决于您是否表示仅包含128个字符的严格 ASCII 这些字符中的每个字符在ASCII编码方案中的编码都与在UTF-8编码方案中的编码完全相同。 对于这些字符,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";
}

对于所有这些真正的 ASCII字符,没有必要对其进行代码转换。

但是 ,如果用“ ASCII”来表示扩展的ASCII (请参阅此处 ),并且谈论带有重音符号和东西的字符,则您会遇到麻烦,因为该术语没有确定的字符集 您会注意到,在php的Multibyte String扩展名的支持字符编码列表中,仅出现了ASCII的首字母缩写词,这是ASCII本身的缩写。

为了更精确地回答您的问题:

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

生成的字符串是ASCII UTF-8,因为这两个编码方案用于那些128个字符相同的字节编码。

这样做是否有负面影响?

如果字符实际上是真正的 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。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM