前台的字符串傳遞到后台進行處理,發現了一個較詭異的問題:字符串中的一個空格(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