我有这个 PHP 代码,它使用 utf8_decode() 在 UTF-8 字符串中转换两个字节数组(一个有 32 个字节,另一个有 70 个字节):
$bytes32 = [144, 204, 205, 119, 77, 176, 172, 140, 110, 162, 222, 255, 14, 38, 252, 82, 118, 138, 130, 124, 145, 199, 55, 162, 224, 80, 102, 141, 140, 57, 194, 36];
$string32 = implode(array_map("chr", $bytes32));
$string32Utf8 = utf8_decode($string32);
$bytes70 = [239, 191, 189, 239, 191, 189, 239, 191, 189, 119, 77, 239, 191, 189, 239, 191, 189, 239, 191, 189, 110, 239, 191, 189, 239, 191, 189, 239, 191, 189, 14, 38, 239, 191, 189, 82, 118, 239, 191, 189, 239, 191, 189, 124, 239, 191, 189, 239, 191, 189, 55, 239, 191, 189, 239, 191, 189, 80, 102, 239, 191, 189, 239, 191, 189, 57, 239, 191, 189, 36];
$string70 = implode(array_map("chr", $bytes70));
$string70Utf8 = utf8_decode($string70);
echo '$string32Utf8: ' . $string32Utf8; // echoes ???wM???n??&?Rv??|??7??Pf??9?$
echo '$string70Utf8: ' . $string70Utf8; // echoes ???wM???n???&?Rv??|??7??Pf??9?$
echo '$string32Utf8 === $string70Utf8: ' . json_encode($string32Utf8 === $string70Utf8); // echoes false
然后我有这个 C# 代码,它使用 Encoding.UTF8.GetString() 做同样的事情:
byte[] bytes32 = new byte[] { 144, 204, 205, 119, 77, 176, 172, 140, 110, 162, 222, 255, 14, 38, 252, 82, 118, 138, 130, 124, 145, 199, 55, 162, 224, 80, 102, 141, 140, 57, 194, 36 };
string string32Utf8 = Encoding.UTF8.GetString(bytes32);
byte[] bytes70 = new byte[] { 239, 191, 189, 239, 191, 189, 239, 191, 189, 119, 77, 239, 191, 189, 239, 191, 189, 239, 191, 189, 110, 239, 191, 189, 239, 191, 189, 239, 191, 189, 14, 38, 239, 191, 189, 82, 118, 239, 191, 189, 239, 191, 189, 124, 239, 191, 189, 239, 191, 189, 55, 239, 191, 189, 239, 191, 189, 80, 102, 239, 191, 189, 239, 191, 189, 57, 239, 191, 189, 36 };
string string70Utf8 = Encoding.UTF8.GetString(bytes70);
首先,在 C# 中,两个字节数组在转换后产生相同的字符串,这与 PHP 不同。其次,与 PHP 相比,C# 中的字符串有所不同。
PHP 中是否有一个函数在给定相同输入的情况下实际上会返回与 C# 的 Encoding.UTF8.GetString() 相同的输出?或者是否有我遗漏的东西实际上导致了 C# 和 PHP 之间的不同输出?
动漫人物