该问题之前已被其他兄弟发现并解决过,具体可参考这两篇文章
1.空格变成问号的怪问题--了解问题是如何产生的https://blog.csdn.net/wuhongyao3/article/details/5834921
2.该问题在读取EXCEL内容这个场景中的处理
https://www.cnblogs.com/ColdHan/p/5733501.html
今天我要写的是基于这两篇文章的一点延伸,两篇文章都只提到空格变成问号这种情况,我发现还有连字符也会变成问号的情况,或许还有其他特别字符也会变成问号的情况,我们要把源头的罪魁祸首找出来,引用前文的代码
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, "-");
如果还发现其他特殊字符,也可以通过这种方式找出来了