【发布时间】:2019-06-22 21:38:32
【问题描述】:
如果我使用函数mb_convert_encoding()将PHP中的ASCII编码字符串转换为UTF-8字符串,然后将其与ASCII编码字符串连接起来,它是什么编码?这样做有什么负面影响吗?
【问题讨论】:
标签: php encoding utf-8 ascii data-conversion
如果我使用函数mb_convert_encoding()将PHP中的ASCII编码字符串转换为UTF-8字符串,然后将其与ASCII编码字符串连接起来,它是什么编码?这样做有什么负面影响吗?
【问题讨论】:
标签: php encoding utf-8 ascii data-conversion
这首先取决于您是否指的是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。它尽其所能执行转换,但我们都知道转换没有意义。
我希望你能欣赏我在这里所得到的。每次您在计算机上看到一个字符时,它都有一些编码。是否有任何负面后果将取决于您如何处理提供给您的数据、您对其执行的转换以及您以后打算如何处理这些数据。
考虑监管链会很有帮助。你的数据是从哪里来的?他们使用了什么编码?那是我在我的系统上使用的吗?我在哪里发送这些数据?是否需要转换?您还应该注意为所有这些内容指定字符集:
等等。
一般经验法则:尽可能使用 utf-8。
【讨论】:
ASCII 是 UTF-8 的子集,因此 ASCII 字符串是有效的 UTF-8 字符串。连接两个 UTF-8 字符串是明确的。
【讨论】: