最近做项目遇到了这个问题,在网上找了一下解决方法,发现这篇文章也是转载的,不过,他没有标出原出处,我在网上查找了一会,没有找到更多的,或者找到的都是别这个还要晚的文章,那么我标明的出处就算这个吧http://blog.csdn.net/wuhongyao3/article/details/5834921

文章:

昨天发现,用 HtmlDecode() 去解码后,“ ”不是被解码为半角的空格(ASCII码0x20)而是变成半角问号“?”(ASCII码0x3F)。而且奇怪的是,只有每行前面的空格才会出问题,如果前面后面有汉字的话,空格就还是空格。但是更加奇怪的是,如果直接在HtmlDecode()的后面直接加上trim()的话,这个问号会被去掉。而正常的情况下,问号是不会被去掉的,只有空格才会被去掉。

发生这个问题的时候,我是在把解码后的内容写入数据库,因此一直都以为是sqlserver与应用程序之间的字符集问题或者编码方式问题。搞了N久,最后才发现在送进SqlServer之前,内容就已经是问号了。

查了很久,也找不到这个问题如何解决。因此,只能使用山寨解决方法了:

1、在Decode之前替换   为 空格。

2、在Decode之后直接加 Trim()

显而易见的,这个不是一个好办法:在显示到浏览器的时候,空格就不见了

最近认真去查了一下这个问题,发现问题的关键,是编码方式:如果使用的Encoding是UTF-8的话,就会发生这种情况。

问题的根源,在于UTF-8这种编码里面,存在一个特殊的字符,其编码是“0xC2 0xA0”,转换成字符的时候,表现为一个空格,跟一般的半角空格(ASCII 0x20)一样,唯一的不同是它的宽度不会被压缩,因此比较多的被用于网页排版(如首行缩进之类)。而其他的编码方式如GB2312、Unicode之类并没有这样的字符,因此如果简单地进行编码转换,生成地GB2312/Unocode字符串中,这个字符就会被替换成为问号(ASCII ox3F)。此时如果进行写库、写文件之类,就会把问号直接写入了。当然此时会有一种山寨方式:直接替换问号为空格。可是这种方法,会把原本真正的问号也枪毙掉。

使用UTF-8进行HTMLDecode的时候,对于语句开头的( ),就会被自动转换成为这个特殊的空格,可能是判断为放在开头的空格,一定是用来排版的。在转换为其他编码之前,这个特殊的空格受到的待遇与普通的半角空格是一致的,甚至也会被trim()去掉。

因此,碰到这个问题的原因有两种:一种是在UTF-8编码下进行了转换,产生了这个字符;还有一种就是网页中直接采用了这个字符进行排版。

知道了具体原因,就有正规的解决方法了。方法就是:在得到UTF-8字符串之后,先进行一个替换,把这个特殊的空格替换为普通的空格,如果是HTML串,建议替换为( )。C#代码如下:

byte[] space = new byte[]{0xc2,0xa0}; string UTFSpace = Encoding.GetEncoding("UTF-8").GetString(space); HtmlStr = HtmlStr.Replace(UTFSpace," ");

这样做,就不会把串里面本来应该有的问号错误的替换为空格。也不会看到讨厌的问号,能保存原来字符串的真面目了。        需要强调的是,替换之前不能进行编码转换,一定要继续使用UTF-8编码。如果已经转换成其他编码,那么错误就已经不可逆转了。没有办法再区分这个错误的问号和正常的问号之间的差别了。

java 空格变成问号_【转】空格变成问号的怪问题相关推荐

  1. java字符串下标替换_字符串空格替换成指定元素实例思路讲解java

    请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20lucky. 思路:从前向后记录' ...

  2. word行首空格下划线_行首空格和下划线问题的解决

    在 Word 文档行首空格和下划线问题的解决 利用 Word 制作试卷 , 经常用下划线画空格线 ( 用作填空 ), 常出现这样的问题 : 到一行将结束 时 , 用下划线画一条填空线 , 但此下划线上 ...

  3. java随机生成标点符号_java去除空格、标点符号的方法实例

    代码如下: public class TempTest { public static void main(String[] args) { //string去除空格 String str=" ...

  4. Java详解去除字符串中空格的方法

    Java去除字符串中空格的方法详解 代码中字符串使用了replaceAll()方法,去除了所有空格(其中包括:首尾空格.中间空格) 遂整理下java关于字符串去除空格的方法. 1.方法分类 str.t ...

  5. java 添加空格方法_java 各种去空格的方法

    String str =" dgd fdgd "; 方法一:str = str.trim();//去前后空格 返回:dgd fdgd 方法二:str = str.replaceAl ...

  6. Java中实现删除左侧空格ltrim和删除右侧空格rtrim

    1.概述 方法String.trim()删除尾随和前导空格.但是,不支持仅执行L-Trim或R-Trim. 在本教程中,我们将看到一些实现此目标的方法.最后,我们将比较它们的性能. 2. while循 ...

  7. 输出空格隔开换行_【前端干货】CSS 的空格处理

    一空格规则 HTML 代码的空格通常会被浏览器忽略. <p>◡◡hello◡◡world◡◡</p> 上面是一行 HTML 代码,文字的前部.内部和后部各有两个空格.为了便于识 ...

  8. Java去除字符串中存在的空格(包括NBSP格式的空格)

    项目场景: 保存在数据库当中的数据,有手动录入和excel导入两种形式,excel导入可能会引入不同形式的空格进去,导致调用方在调用时出现类型转换异常. 原因分析: excel导入的时候,引入了普通空 ...

  9. Java 英文句子去掉多余的空格

    英文句子一般都是每个英文单词之间只隔一个空格,开头和末尾没有空格. 思路: 1.去掉首尾空格 2.遍历字符串,判断是否为空格 (1)当前字符不是空格,加入 (2) 当前字符是空格,再判断下一个字符是否 ...

  10. python去空格的函数_(转)python strip()函数 去空格\n\r\t函数的用法

    原文:http://www.cnblogs.com/zdz8207/p/python_learn_note_20.html python3.4学习笔记(二十) python strip()函数 去空格 ...

最新文章

  1. avformat_alloc_output_context2 -22错误
  2. TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现
  3. 10自带sftp服务器_WinSCP v5.15.3 免费的 开源图形化 SFTP 客户端
  4. 知乎大神深入解析:单片机晶振脚原理是什么?
  5. position属性absolute(绝对定位),relatve(相对定位)
  6. RUBY常用类库文档翻译以及使用示例
  7. RAID6磁盘阵列数据恢复
  8. 一项千年太空任务即将拯救人类——科学家们正在密谋中
  9. C盘哪些文件可以删除?windows7瘦身攻略
  10. 一个命令清理电脑垃圾,不用再安装任何管家软件,节省电脑资源,让电脑运行更快更流畅
  11. 魔兽地图编辑器插件YDWE的使用与基本设置
  12. P4313 文理分科 详细理解
  13. 查找计算机里包含相关文字,windows7如何搜索包含关键字的文件_win7电脑文件怎么查关键字文件...
  14. 【报告分享】淘宝直播2021年度报告-淘榜单淘宝直播(附下载)
  15. 企业微信禁用成员是什么意思?
  16. 翻译: ChatGPT 的激发敬畏、恐惧、特技和试图绕过其护栏的尝试
  17. python自动发送邮件不需要发件邮箱_python 自动发送邮件
  18. java jcr_java – 通过JCR实现基于标签的搜索系统的最佳方式,如Modeshape
  19. 理论+实践解析“IT治理”之模式与原则
  20. Angular4 - 路由

热门文章

  1. Mycat 使用navicat连接 报: no datanode found please check tables defined is schema:test
  2. 在北大国家发展研究院发言
  3. Android拍照,相册选择图片以及Android6.0权限管理
  4. ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException 解决方案【SOLVED】
  5. Window系统多硬盘设置新引导盘
  6. 数字逻辑电路——第四章 组合逻辑电路
  7. 使用telnet方式管理交换机
  8. 100个c#初学者编程实例_C#编程:初学者入门
  9. excel 删除重复项_在Excel 2007中删除重复项
  10. 体现中文编程独有特点的一些探索