关于转义字符和编码转换函数的研究

来源:互联网 发布:电信云计算待遇 编辑:程序博客网 时间:2024/05/16 07:31
    (本文为个人原创,转载请著名出处)

由于本人想做一个学校图书馆检索书的Android客户端以方便同学们查书,需要从学校图书馆网站上抓取信息。今天在分析学校官网源代码是被一串乱码难住如下:
————————————————————————————————————————————————————————————— 
“1.三体I247.55/77”

这串乱码的实际意义是:

1.三体    I247.55/77”(其中“三体
”是书名“I247.55/77”是书籍位置编号 
————————————————————————————————————————————————————————————— 
 
        以上内容都是在编软件时重要的数据 ,我必定要把其转为汉字字符串才能使用。于是乎开始研究规律,在查询了大量资料和加密转码上面的中文字符串后发现是unicode编码的变形(尼玛花了我一个小时)。标准的unicode编码是"\u0032"这样的,组成为“\u”和后面四位十六进制数字组成。所以上面的乱码应该解码为:
————————————————————————————————————————————————————————————— 
“1.\u4e09;\u4f53;\u0049;\u0032;\u0034;\u0037;\u002e;\u0035;\u0035;\u002f;\u0037;\u0037;” 
—————————————————————————————————————————————————————————————  
        这在java中很容易只要把字符串中的“&#x”替换成“\u”,就行了。关键就是这里 ,你要是直接替换“\u”,编译器会告诉你这不是合法的转义字符,不能替换。那好根据我们学的知识改成“\\u”。ok了!可以转换了,字符串也转成了后者的模样。但是尼玛输出也是后面这样不能忍啊,我要的可是中文字符串啊。在研究了replace函数和replaceAll和正则表达式后仍然没有头绪。其实简单化的话就是这样的:
问题:GB2312转成Unicode编码
比如:
String s="\u4f53";
System.out.println(s);    
//这里输出的就是中文的“体”字 
 

String s1="\\u4f53";
System.out.println(s1);     //这里输出的是“\u4f53”

而我们想让后者也就是s1输出
“体”字。这里个位看官们可以自己动脑想下应该怎么写个s1转换函数使其转换成汉字。我自己比较笨,经过了好久差了半天jdk的api才解决,牵扯到正则表达式和进制转换。具体大家可以查api和转换方面的知识,懒人也可以直接饮用。其他语言思路也应该差不多;
代码如下:

public static String toCN(String str)
StringBuffer gbk = new StringBuffer(); 
try
{
//注意,分隔符是:"\\\\u" 
String[] hex = str.split("\\\\u");  
//注意要从 1 开始,而不是从0开始。第一个是空。 
for(int i=1;i<hex.length;i++)
{   
//将16进制数转换为 10进制的数据。 
int data = Integer.parseInt(hex[i],16); 
//强制转换为char类型就是我们的中文字符了。 
gbk.append((char)data);  
}
catch(Exception e)
{
//设定异常信息的内容
e.printStackTrace();
}
return gbk.toString(); 

问题虽小,却也花了我一下午的时间,希望在各位再次碰到这个问题时候能给各位提供帮助
0 0
原创粉丝点击