今天遇到一个问题:

网页上的一段文字中有几个空格,把这段文字当作文件名称保存为一个windows系统下的文件后,文件名中本来是空格的地方变成了问号,另外一个C#程序打开这个文件,也提示找不到文件。

初步估计是这几个空格的编码有问题。用16进制的编辑器打开这段文字:

打开后发现,这几个空格的编码是C2A020C2A0,那么平常用的空格是什么编码呢?

找到一个正常的带空格的字符串“2018-11-20 14:09:07”看了一下,中间的空格的编码是20通过对比发现C2A020C2A0是三个“空格”,分别是C2A0、20、C2A0,那么这个C2A0到底是什么呢?

C2A0是UTF8里的排版用的空格(这个空格是与ASCII、unicode中的空格是不一样的,ASCII中的空格编码是20,unicode中的空格是0xA0),但是这个特殊的字符,不在GBK字符集中。却频繁用于xml/html等格式的文件中。大量UTF-编码的网页使用这个字符用作占位的空格。而且不同浏览器对它的处理方式不同:IE浏览器识别出该符号并以空格显示,chrome、firefox则替换为xml转义字符 &nbsp。

原来C2A0就是我们网页中常用的全角空格&nbsp。用户从其他网页上拷贝了一段包含此字符的字符串,复制到我们的网页界面上显示正常,但是我们的C++程序将编码格式转换成 GBK时,就出现了乱码。

GBK字符集只收录了两万多个字符,比UTF-8的字符数量少得多。转化到GBK编码的时候,就会有编码是GBK字符集以外的,不能转化成GBK编码。这部分字符在转换之后的字符串中都变成了“?”,注意,这个问号只是显示为问号而不是真正的问号。

处理方法:

在保存文件之前,对文件名做一个特殊处理,用 0×20 代替掉 0xC2A0,程序(C#)如下所示:

private string ChangeUTF8Space(string targetStr)
         {
             try
             {
                 string currentStr = string.Empty;
                 byte[] utf8Space = new byte[] { 0xc2, 0xa0 };
                 string tempSpace = Encoding.GetEncoding("UTF-8").GetString(utf8Space);
                 currentStr = targetStr.Replace(tempSpace, " ");
                 return currentStr;
             }
             catch (Exception ex)
             {
                 return targetStr;
             }
         }

UTF-8字符C2A0引起的问题的更多相关文章

  1. Bypass WAF Cookbook

    PS.之前一直想把零零碎碎的知识整理下来,作为知识沉淀下来,正好借着wooyun峰会的机会将之前的流程又梳理了一遍,于是就有了下文.也希望整理的内容能给甲方工作者或则白帽子带来一些收获. 0x00 概 ...

  2. FusionCharts参数的详细说明和功能特性(转)

    功能特性animation                    是否动画显示数据,默认为1(True)showNames                    是否显示横向坐标轴(x轴)标签名称ro ...

  3. 《Pandoc用户指南》之一

    @(编程) 1. 描述 Pandoc是一个用于从一种标记格式转换为另一种的Haskell库,还是一个使用该库的命令行工具.它可以读取markdown格式和Textile格式(的子集).reStruct ...

  4. 【转】NI语法 JNI参考 JNI函数大全

    原文网址:http://blog.sina.com.cn/s/blog_5de73d0b0101chk1.html 一.对照表 Java类型    本地类型         描述boolean     ...

  5. 基于Socket的Android手机视频实时传输

    首先,简单介绍一下原理.主要是在手机客户端 (Android)通过实现Camera.PreviewCallback接口,在其onPreviewFrame重载函数里面获取摄像头当前图像数据, 然后通过S ...

  6. unicode utf8 学习记录

    显示器- unicode -系统- utf8 -存储设备 Unicode是一套复杂的字符编码标准,简单来说就是将人类使用的每个所谓字符与一个非负整数对应,并且保证不同的字符对应的整数一定不同.UTF- ...

  7. OAuth 2.0 RFC 框架 中文

    Internet Engineering Task Force (IETF) D. Hardt, Ed.Request for Comments: 6749 MicrosoftObsoletes: 5 ...

  8. MySQL INFORMATION_SCHEMA 使用

    --查看创建的索引的CARDINALITY比率 --通常cardinality达到表数据的10%左右建索引会有意义--如果是一个组合索引,索引第一位的cardinality表示第一个列的cardina ...

  9. 初学者对ASCII编码、Unicode编码、UTF-8编码的理解

    最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是 255(二进制 11111111=十进制 255),如果要表示更大的整数,就必须用更多的字节. ...

随机推荐

  1. 网页控制脚本修改系统信息 C语言调用uci

    0 交叉编译生成程序 http://tuntuntun.net/%E5%9C%A8OpenWrt%E4%B8%8A%E8%BF%90%E8%A1%8C%E7%AC%AC%E4%B8%80%E4%B8% ...

  2. Hive JDBC:java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate anonymous

    今天使用JDBC来操作Hive时,首先启动了hive远程服务模式:hiveserver2 &(表示后台运行),然后到eclipse中运行程序时出现错误: java.sql.SQLExcepti ...

  3. apose和spire操作word

    Apose public void doSaveAsword(Dictionary<string,string> dict) { //--------------------------- ...

  4. 使用Builder模式创建复杂可选参数对象

    在新建对象时,若需要对大量可选参数进行赋值,最常见的做法是JavaBeans模式,即调用一个无参构造方法创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数.代码示例如下: ...

  5. 01-Django介绍和安装

    01-Django介绍和安装 1.Django介绍 1.1介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M(Model),视图V(View)和控 ...

  6. python_while

    while 格式 while 条件 : pass 使用 while True : print("精忠报国") print("粉红的回忆") print(&quo ...

  7. Problem 2. number题解

    number:数学+二分图匹配 首先,如果S<N,那么S+1,S+2...N这些数直接放在S+1,S+2...N的位置上(如果其他数x放在这些位置上面,这些数不放在对应位置,那么x一定能放在这些 ...

  8. luogu3687-[ZJOI2017] 仙人掌

    Description P3687 [ZJOI2017]仙人掌 - 洛谷 | 计算机科学教育新生态 Solution 我们先考虑只有一棵树如何处理. 仙人掌可以看做若干环的集合. 特别的, 对于一条没 ...

  9. 关于解决Tomcat服务器Connection reset by peer 导致的宕机

    org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer at ...

  10. windows下的vimrc

    很奇怪的事...不会解释 建议编译位置第一次设置为 map <F9> :call CR()<CR>func! CR()exec "w"exec " ...