`

Java 解决采集UTF-8网页空格变成问号乱码

阅读更多

昨天发现,用 HtmlDecode() 去解码后,“ ”不是被解码为半角的空格(ASCII码0x20)而是变成半角问号“?”(ASCII码0x3F)。而且奇怪的是,只有每行前面的空格才会出问题,如果前面后面有汉字的话,空格就还是空格。但是更加奇怪的是,如果直接在HtmlDecode()的后面直接加上trim()的话,这个问号会被去掉。而正常的情况下,问号是不会被去掉的,只有空格才会被去掉。
      发生这个问题的时候,我是在把解码后的内容写入数据库,因此一直都以为是sql******与应用程序之间的字符集问题或者编码方式问题。搞了N久,最后才发现在送进Sql******之前,内容就已经是问号了。

      查了很久,也找不到这个问题如何解决。因此,只能使用山寨解决方法了:
转自http://www.jiaonan.tv/html/blog/1/29483.htm
      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," ");

 

java版:

            byte bytes[] = {(byte) 0xC2,(byte) 0xA0};
            String UTFSpace = new String(bytes,"utf-8");
            html = html.replaceAll(UTFSpace, " ");

      这样做,就不会把串里面本来应该有的问号错误的替换为空格。也不会看到讨厌的问号,能保存原来字符串的真面目了。

      需要强调的是,替换之前不能进行编码转换,一定要继续使用UTF-8编码。如果已经转换成其他编码,那么错误就已经不可逆转了。没有办法再区分这个错误的问号和正常的问号之间的差别了。 

分享到:
评论

相关推荐

    C# 生成xml文件,编码为utf-8方法

    C# 生成 XML 文件,编码为 UTF-8 方法 C# 生成 XML 文件,编码为 UTF-8 方法是指在 C# 编程语言中,使用特定的方法和类来生成 XML 文件,并将其编码为 UTF-8 编码格式的过程。这种方法常用于数据交换、配置文件、...

    UTF-8汉字码表.txt

    UTF-8编码广泛应用于网页、文件系统、数据库等领域,特别是在国际化应用中,其能够支持几乎所有的语言文字,成为现代信息技术中不可或缺的一部分。 通过以上分析可以看出,“UTF-8汉字码表.txt”所涉及的知识点主要...

    易语言将文本转换为UTF-8码

    在处理文本数据时,易语言提供了丰富的函数和方法,其中之一就是将文本转换为UTF-8编码。 UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode字符集中的所有字符。与GBK等其他编码相比,UTF-8在全球化和...

    如何将编码转换为UTF-8

    1. UTF-8 编码的重要性:在 WEB 开发中,UTF-8 编码扮演着非常重要的角色,特别是在传递中文时,必须经过编码的动作,否则可能会出现乱码的情况。 2. 使用 URLEncoder.encode() 方法:在 Java 中,可以使用 java...

    utf-8转换asii-2码的转换工具

    转换过程中需要注意的是,UTF-8编码的非ASCII字符在ASCII-2中可能无法表示,这时需要进行替换或忽略,否则会导致乱码。 转换过程通常涉及以下几个步骤: 1. 解析UTF-8文本:读取UTF-8编码的文件,按照UTF-8的规则...

    winForm中进行Utf-8 及 GB2312转换

    Utf-8和GB2312是两种常见的字符编码格式,它们各自有着特定的应用场景和特点。Utf-8是一种广泛使用的多字节字符编码,支持Unicode字符集,能表示世界上几乎所有的文字。GB2312则是中国国家标准的简体中文编码,主要...

    解决LINUX LITE方块乱码的中文字体

    2.选择语言编码,默认已选择en_US.UTF8,zh_CN UTF-8 UTF-8,用空格键将以下两项打上星号,zh_CN GB2312,zh_CN GBK GBK,回车确认。 3.选择系统默认语言为英文en_US.UTF8 4.为当前用户配置默认语言为中文zh_...

    delphi操作utf-8转码HTTPEncode

    1. 将UTF-8字符串转换为Unicode字符串:你可以使用`UTF8ToString()`函数将UTF-8编码的字节数组转换为`AnsiString`,然后通过`AnsiToString()`将其转换为`WideString`。 ```delphi var UTF8Bytes: TBytes; Unicode...

    java中文乱码之解决URL中文乱码问题的方法

    - **一次转码**:使用`encodeURI()` 对URL进行编码,然后在服务器端使用适当的解码方法,如Java中的`new String(name.getBytes("ISO-8859-1"), "UTF-8")`,确保从ISO-8859-1转回UTF-8。 - **二次转码**:先使用`...

    GBK编码转换和UTF-8编码转换模块源码

    UTF-8的一个重要特性是对ASCII字符集的兼容性,ASCII字符在UTF-8编码下只占用一个字节,这使得UTF-8在互联网上被广泛应用,因为它可以无缝地与大部分基于ASCII的系统交互。 在资源中提到的“GBK编码转换为URL编码”...

    常用编码(Unicode,UTF-8,GBK)转换工具

    本文将深入探讨标题中提及的几种编码方式:Unicode、UTF-8以及GBK,同时也会涉及到URL编码和XML转义,这些都是编程和网络通信中不可或缺的部分。 首先,Unicode是一个字符集,旨在为世界上所有语言提供一个统一的...

    utf-8解码小程序

    UTF-8是一种可变长度的Unicode字符编码方式,它能兼容ASCII并支持世界上几乎所有的字符集。在Web开发中,UTF-8是最常用的字符编码之一,因为它可以高效地存储和传输多语言文本。 ### 2. URL编码与解码 URL编码(也...

    Java Http请求传json数据乱码问题的解决

    在JavaScript中,确保使用UTF-8编码序列化JSON对象,在Java服务端,使用`URLDecoder.decode`方法以正确的字符集解码请求参数。在必要时,可以通过前端的URL编码或Base64加密,后端的解码来进一步保证数据传输的准确...

    字符编码笔记:ASCII,Unicode和UTF-8

    ### 字符编码笔记:ASCII,Unicode和UTF-8 #### 1. ASCII码 ASCII码是上个世纪60年代由美国制定的一套字符编码标准,用于规定英语字符与计算机内部二进制位之间的关系。在计算机内部,信息通常以二进制形式存在,...

    中文转UTF-8编码

    ### 中文转UTF-8编码知识点详解 #### 一、前言 在计算机科学与互联网技术领域中,字符编码是一项非常重要的技术。随着全球化的发展,多语言支持成为了软件开发中的基本需求之一。其中,UTF-8(Unicode ...

    url编解码utf-8 ANSI 解码工具

    在网页和网络传输中,UTF-8已经成为默认的字符编码,因为它可以处理多种语言,包括中文、英文和其他非拉丁字符。 3. ANSI编码:ANSI编码通常指的是Windows系统下的代码页,如CP1252,它是一个8位编码,主要针对英语...

    URL编码,Gb2312页面提交到Utf-8页面

    本文将深入探讨如何实现从Gb2312编码的网页向Utf-8编码网页的数据提交过程中的URL编码转换。Gb2312是一种广泛应用于中国大陆地区的字符编码标准,而UTF-8则因其能够支持全球绝大多数语言的特性,在互联网领域得到...

    java-c作业---空格字母还有数字的数目---马克-to-win java视频

    java作业 空格 字母 数字 马克-to-win java视频 详细介绍

    Url编码转换程序 gb2312 utf-8 编码 解码

    而UTF-8是一种变长的Unicode编码,它可以表示几乎所有的世界语言字符,包括中文,并且在Web上得到了广泛的应用。 编码过程是从一种字符集(如GB2312或UTF-8)转换到URL编码,解码则是相反的过程。在GB2312到URL编码...

    解决UTF-8格式PHP页面输出空行的简便方法

    在PHP开发过程中,UTF-8编码格式已经成为标准,它能支持全球各种语言的字符显示,大大增强了网页的国际化能力。然而,在使用UTF-8格式的PHP页面时,开发者可能会遇到一个常见问题,即页面输出时出现不必要的空行,这...

Global site tag (gtag.js) - Google Analytics