![](/img/trans.png)
[英]What to do to be sure to get a UTF-8 encoded string back independent from the encoding of the input in PHP
[英]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。 它尽最大可能执行转换,但是我们都知道转换没有意义。
希望您能体谅我在这里得到的一切。 每次您在计算机上看到一个字符时,它都有一些编码。 是否存在任何负面后果将取决于您如何对待收到的数据,对数据执行的转换以及以后打算如何处理。
考虑一下监管链会很有帮助。 您的数据来自哪里? 他们使用什么编码? 那是我在系统上使用的吗? 我要在哪里发送这些数据? 是否需要转换? 您还应该谨慎指定所有这些字符集:
等等。
一般经验法则:尽可能使用utf-8。
ASCII是UTF-8的子集,因此ASCII字符串是有效的UTF-8字符串。 连接两个UTF-8字符串是明确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.