1 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
您示例中的字節(jié)數(shù)組不是有效的 UTF-8?;旧?,如果您在 C# 輸出中看到 ?? 符號(hào),則表示Encoding.UTF8.GetString()
使用替換字符來表示無法轉(zhuǎn)換為輸出字符的編碼輸入字節(jié)序列。
但是,您仍然可以在 PHP 中重現(xiàn)完全相同的行為Encoding.UTF8.GetString()
:
$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 = \pack('C*', ...$bytes32);
$string32Utf8 = \mb_convert_encoding($string32, 'ASCII', 'UTF-8');
$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 = \pack('C*', ...$bytes70);
$string70Utf8 = \mb_convert_encoding($string70, 'ASCII', 'UTF-8');
\var_dump($string32Utf8, $string70Utf8, $string32Utf8 === $string70Utf8);
我做的不同的事情:
由于 byte array 表示UTF-8 string,我們不能使用
chr
將其轉(zhuǎn)換為二進(jìn)制字符串。如chr
函數(shù)文檔中所述:此函數(shù)不知道任何字符串編碼,特別是不能傳遞 Unicode 代碼點(diǎn)值以生成多字節(jié)編碼(如 UTF-8 或 UTF-16)的字符串。
pack
另一方面,函數(shù)可以處理各種類型的二進(jìn)制數(shù)據(jù)格式。\pack('C*', ...$bytes32)
意味著字節(jié)數(shù)組將被視為一系列無符號(hào)字符并打包成二進(jìn)制字符串。utf8_decode
函數(shù)有一個(gè)非?;靵y的名字;它應(yīng)該被命名為類似的東西,utf8_to_iso88591
因?yàn)檫@正是它的作用:將包含以 UTF-8 編碼的 ISO-8859-1 字符的字符串轉(zhuǎn)換為單字節(jié) ISO-8859-1
如果我們想復(fù)制
Encoding.UTF8.GetString()
示例,我們真正需要做的是將 UTF-8 編碼的二進(jìn)制字符串轉(zhuǎn)換為 ASCII。你可以使用mb_convert_encoding
函數(shù)來做到這一點(diǎn),就像這樣:mb_convert_encoding($utf8String, 'ASCII', 'UTF-8')
希望這些評(píng)論會(huì)有所幫助!
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報(bào)