UTF-8編碼的空格(194 160)問題


  前台的字符串傳遞到后台進行處理,發現了一個較詭異的問題:字符串中的一個空格(ASCII:32)被UTF-8編碼之后變成了一個詭異的字符(ASCII:194 和 160的組合)!但在后台其表象還是空格。

  在UTF-8編碼里面存在一個特殊的字符,其編碼是“0xC2 0xA0”,轉換成字符的時候表現為一個半角空格,跟一般的半角空格(ASCII 0x20)不同的是它的寬度不會被壓縮,所以排版中常能用到它。但是GB2312、Unicode之類並沒有這樣的字符,所以轉換后前台會顯示為“?”號,只是顯示為問號而不是真正的問號,所以無法被替換!

  對這兩個看似相同的字符串進行一下轉換可以確認:原始的字符串為:”#'  %$ ()_ -{}.b“  被轉義后的字符串為:”#'  %$ ()_ -{}.b“ 【注:雙引號不算,轉換為byte數組之后可以看到,原來的是16個字節,后來的那個是17個字節:這就是 32 --> 194  160 的結果】

            string tmp1 = "#'  %$ ()_ -{}.b";
            string tmp2 = "#'  %$ ()_ -{}.b";
            byte[] o1 = Encoding.UTF8.GetBytes(tmp1);
            byte[] o2 = Encoding.UTF8.GetBytes(tmp2);

  知道了這個原因之后,就好辦了,寫代碼可以把194 和 160 的組合轉換回去。程序(C#)如下所示:

        private string ChangeUTF8Space(string targetStr)
        {
            try
            {
                string currentStr = string.Empty;
                byte[] utf8Space = new byte[] { 0xc2, 0xa0 };
                string tempSpace = Encoding.GetEncoding("UTF-8").GetString(utf8Space);
                currentStr = targetStr.Replace(tempSpace, " ");
                return currentStr;
            }
            catch (Exception ex)
            {
                return targetStr;
            }
        }

  更多的編碼格式對照表可以看這篇文章:http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM