該問題之前已被其他兄弟發現並解決過,具體可參考這兩篇文章
今天我要寫的是基於這兩篇文章的一點延伸,兩篇文章都只提到空格變成問號這種情況,我發現還有連字符也會變成問號的情況,或許還有其他特別字符也會變成問號的情況,我們要把源頭的罪魁禍首找出來,引用前文的代碼
byte[] space = new byte[] { 0xc2, 0xa0 };
string UTFSpace = Encoding.GetEncoding("UTF-8").GetString(space);
name = name.Replace(UTFSpace, " ");
解決這個問題只需要把0xc2,0xa0這兩個字節轉成字符串,然後在原字符串中把它替換爲空格。
那這個0xc2,0xa0又是怎麼來的呢?
其實也很簡單,只需要把原字符串轉成UTF-8的字節碼,然後在字節碼中找出來就行了,示例如下
byte[] bytes = Encoding.GetEncoding("UTF-8").GetBytes(name);
如原字符串爲"Lin‑Lin",轉成字節碼是"0x4C,0x69,0x6E,0xE2,0x80,0x91,0x4C,0x69,0x6E",通過對比找出這個連字符的字節碼爲"0xE2,0x80,0x91",然後再用同樣的方法替換爲正常的連字符
byte[] lian = new byte[] { 0xe2, 0x80,0x91 };
string UTFLian = Encoding.GetEncoding("UTF-8").GetString(lian);
s = s.Replace(UTFLian, "-");
如果還發現其他特殊字符,也可以通過這種方式找出來了