簡體   English   中英

如果在PHP中將UTF-8編碼的字符串與ASCII字符串連接起來,結果字符串將是什么編碼?

[英]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。 它盡最大可能執行轉換,但是我們都知道轉換沒有意義。

希望您能體諒我在這里得到的一切。 每次您在計算機上看到一個字符時,它都有一些編碼。 是否存在任何負面后果將取決於您如何對待收到的數據,對數據執行的轉換以及以后打算如何處理。

考慮一下監管鏈會很有幫助。 您的數據來自哪里? 他們使用什么編碼? 那是我在系統上使用的嗎? 我要在哪里發送這些數據? 是否需要轉換? 您還應該謹慎指定所有這些字符集:

  • 您從客戶那里收到的數據
  • 表單提交到您的網站
  • 在您的網站上顯示html
  • 在應用程序中對文本字符串進行操作
  • 與數據庫的連接的字符編碼,數據庫中的表的字符編碼以及這些表中的列的編碼
  • 存儲數據的字符編碼
  • 電子郵件字符編碼
  • 提交給API的數據的字符編碼

等等。

一般經驗法則:盡可能使用utf-8。

ASCII是UTF-8的子集,因此ASCII字符串是有效的UTF-8字符串。 連接兩個UTF-8字符串是明確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM