HTML中空格占位符 乱码问题

2018-01-27 12:25:22 +0000

      使用Ruby Nokogiri对含有 的空格占位符富文本进行解析等操作后在转换成string后,就会出现???乱码。这应该就是编码的问题,但始终不知道根本原因,后来看到一篇博文解释了问题的根源。

       在UTF-8这种编码里面,存在一个特殊的字符,其编码是“0xC2 0xA0”。转换成字符的时候,表现为一个空格,跟一般的半角空格(ASCII 0x20)一样,唯一的不同是它的宽度不会被压缩,因此比较多的被用于网页排版(如首行缩进之类)。而其他的编码方式如GB2312、Unicode之类并没有这样的字符,因此如果简单地进行编码转换,生成地GB2312/Unocode字符串中,这个字符就会被替换成为问号(ASCII ox3F)。

       作者给出了C#和Java版本解决方案,如下:

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, " ");

 

但是我想如果在JRuby怎么写呢,怎么构建byte[] ?最后找到另外一种Java和Jruby写法,分享下。

Java:

        byte bytes[] = {Integer.valueOf(0xC2).byteValue() ,(byte) 0xA0};

        String UTFSpace = new String(bytes,"utf-8");

        safeHTML = safeHTML.replaceAll(UTFSpace, " ");

ruby:

       bytes = Java::byte[2].new

       bytes[0] = Java::JavaLang::Integer.valueOf(0xC2).to_java.byteValue()

       bytes[1] = Java::JavaLang::Integer.valueOf(0xA0).to_java.byteValue()

       htmlSpace = Java::JavaLang::String.new(bytes)

       content = content.to_java_string.replace(htmlSpace, " ")

 

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

 

相关链接:

https://www.cnblogs.com/renxiaoren/p/5442431.html