![](/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.