记字符编码与转义符的纠缠

首先先声明一下,这篇文章是记录工作中遇到的一个问题,以及如何解决(这里也感谢一下百度知道的一位高手我的账号很强大提供的解决方案),并不是教程类型的文章,你在本文中学不到字符编码和转义符的全面知识,所以对于想学习字符编码或转义符的童鞋请绕道,博客园里有很多专业文章供您学习。

那么这篇文章适合谁读呢?如果你对字符编码的基础知识和转义符的概念有了解(转义符是语言必备的,而字符编码需要自行全面了解一下),而在实际工作中遇到把带有转义符的字符编码形式作为字符串表现出来了,导致本来想显示“错误!”,却显示了“\u9519\u8bef\uff01”。这时你可以参考我这篇文章,或许可以节省你尝试解决的时间。

先说说我工作中遇到的问题,在跟客户的其他系统做接口时,对方系统会返给我一个错误信息,里面是中文文字,用的是UTF-8编码格式。我的系统是asp.net mvc(C#),接口是在服务器端完成,用了HttpWebRequest和HttpWebResponse模拟浏览器操作,接受响应流并转为字符串。但是问题来了,获取到的字符串总是“\u9519\u8bef\uff01”,这个东西一看就是字符编码,具体是什么字符编码,因为跟对方系统有约定,所以肯定是UTF-8编码,我百度了一下,说\u打头的编码应该是Unicode,后来又了解到Unicode是一种广义的编码,而UTF-8是Unicode编码的一种。这时我把这个字符串直接复制到代码文件中,如string s="\u9519\u8bef\uff01",然后运行程序发现控制台窗口和跟踪到的s变量值都是汉字“错误!”,这是什么原因呢?这时我想到了转义符,C#中的转义符是\,如果我要表示",就是\",而表示\,就是\\。也就是说我在代码中写的string s="\u9519\u8bef\uff01",实际\u就是转义为Unicode编码的意思,它后面跟的就是汉字对应的Unicode编码。那么如果我不想显示汉字,就是想显示“\u9519”这个字符串,怎么办?聪明的你已经想到了,应该是string s="\\u9519\\u8bef\\uff01",运行程序,不再显示“错误!”,而是显示“\u9519\u8bef\uff01”。那么问题又来了,如果这个字符串是我定义的,我可以通过增删\来表达是否转义的需求,但是我接收的字符串就已经是"\\u9519\\u8bef\\uff01"这个形式了,如果想要通过Replace函数将\\替换\是不可能的,因为实际字符串里存储的只是一个\,并不是两个\,这怎么办?我现在只想把字符\换成转义符\,这个我是没实现得了(如果哪位老师知道如何处理这类问题,那么请不吝赐教),因为转义符是写代码层面的,并不是在程序执行层面的。于是我开始了百度大法,找到了这边文章《\u6C5F\u8FB9\u57CE\u5916\u70E4\u5168\u9C7C ..._百度知道》,我的账号很强大给出了一个解决办法。

1 string testString="\\u9519\\u8bef\\uff01";
2 System.Text.RegularExpressions.MatchCollection mc=System.Text.RegularExpressions.Regex.Matches(testString,"\\\\u([\\w]{4})");
3 string result=testString.Replace("\\u","");
4 char[] arrChar=new char[mc.Count];
5 for(int i=0;i<arrChar.Length;i++)
6 {
7   arrChar[i]=(char)Convert.ToInt32(result.SubString(i*4,4),16);
8 }
9 result=new String(arrChar);

代码很简单就是先把字符串中\u+4位编码分组找到,然后将\u去掉,把每组4位编码先转成Int32位整数(ToInt32方法中,第二个参数16是什么意思不太清楚),最后再把这个整数转为对应char字符,然后通过这组字符数组构造出字符串,就可以了。

当然了,如果接受到的字符串的值,并不是UTF-8编码格式的表现字符串,那么这个方法可能就失效了,具体实现应该参照每个字符编码的规范形式进行解析。

问题解决了,但是还有几点留待后续研究:1、形如字符编码的字符串如何能直接转为字符编码对应的实际字符串?2、ToInt32方法的第二个参数的作用是什么,如果不是UTF-8编码格式,第二个参数的值是否就不是16了?3、如果是其他字符编码格式(非UTF-8),如何解析?如果后续找到答案,我会补充到这里。

posted @ 2015-04-01 10:16  守护晴天  阅读(1115)  评论(0编辑  收藏  举报