今天遇到一个问题:

网页上的一段文字中有几个空格,把这段文字当作文件名称保存为一个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. js获取数组中最大值,最小值

    遍历方法 var arr =[12,14,34,566,34,98,77] var max = arr[0]; for(var i=0;i<arr.length;i++){ if(max< ...

  2. 转://oracle 软件的收费模式

    Oracle软件本身是免费的,所以任何人都可以从Oracle官方网站下载并安装Oracle的数据库软件,收费的是License,即软件授权,如果数据库用于商业用途,就需要购买相应Oracle产品的Li ...

  3. JAVA进阶23

    1.统计文件夹大小 package cn.demo02; import java.io.File; /** * @Classname DirTest03 * @Description TODO * @ ...

  4. 好程序员web前端分享HTML基础篇

    好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基 ...

  5. 一) Spring 介绍、IOC控制反转思想与DI依赖注入

    一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...

  6. Divisibility by 25 CodeForces - 988E (技巧的暴力)

    You are given an integer nn from 11 to 10181018 without leading zeroes. In one move you can swap any ...

  7. [题解]ybt1365:FBI树(fbi)

    ybt1365:FBI树(fbi) [题目描述] 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它 ...

  8. python使用装饰器对文件进行读写操作'及遍历文件目录

    '''使用装饰器对文件进行读写操作''' # def check_permission(func): # '''演示嵌套函数定义及使用''' # def wrapper(*args,**kwargs) ...

  9. NodeJs操作MongoDB之分页功能与常见问题

    NodeJs操作MongoDB之分页功能与常见问题 一,方法介绍 1,聚合操作之count count()方法可以查询统计符合条件的集合的总数 db.User.count(<query>) ...

  10. 详解volatile 关键字与内存可见性

    先来看一个例子: public class VolatileTest {            public static void main(String[] args) {           T ...