Python去除\ufeff、\xa0、\u3000等字符 - iyuluo

文章推薦指數: 80 %
投票人數:10人

在使用Python处理一些txt或者csv文件过程中,在输出的一些结果里面会有一些特殊的字符例如:\ufeff、\xa0、\u3000 简单来说,这三个字符串分别是字节 ... HomeArchivesCategoriesTagsAboutPosted 2022-08-31Updated 2022-08-31Python12minutesread(About1776words)Python去除\ufeff、\xa0、\u3000等字符在使用Python处理一些txt或者csv文件过程中,在输出的一些结果里面会有一些特殊的字符例如:\ufeff、\xa0、\u3000 简单来说,这三个字符串分别是字节顺序标记,不间断空白符,全角的空白符。

分别可以使用以下的方法去除。

1、去除\ufeff一般会出现在文件的最开始,也叫头文件,表明了改文件的编码方式。

一般在读取的时候提示FileNotFoundError:「Errno2]Nosuchfileordirectory:'\ufeffA.txt'一般只需改一下编码,把utf-8编码改成utf-8-sig 12withopen(file_path,'r',encoding='UTF-8-sig')asf:s=f.read() 2、去除\xa0\xa0是不间断空白符  我们通常所用的空格是\x20,是在标准ASCII可见字符0x200x7e范围内。

而\xa0属于latin1(ISO/IEC_8859-1)中的扩展字符集字符,代表空白符nbsp(non-breakingspace)。

latin1字符集向下兼容ASCII(0x200x7e)。

通常我们见到的字符多数是latin1的,比如在MySQL数据库中。

1str.replace(u'\xa0',u'') 3、去除\u3000根据Unicode编码标准及其基本多语言面的定义,\u3000属于CJK字符的CJK标点符号区块内,是空白字符之一。

它的名字是IdeographicSpace,有人译作表意字空格、象形字空格等。

顾名思义,就是全角的CJK空格。

它跟nbsp不一样,是可以被换行间断的。

常用于制造缩进. 1str.replace(u'\u3000',u'') 同时去除空格和\xa0、\u3000 1title.strip().replace(u'\u3000',u'').replace(u'\xa0',u'') 编码概念ANSCII:标准的ANSCII编码只使用7个比特来表示一个字符,因此最多编码128个字符。

扩充的ANSCII使用8个比特来表示一个字符,最多也只能编码256个字符。

Unicode:使用2个甚至4个字节来编码一个字符,因此可以将世界上所有的字符进行统一编码。

UTF:Unicode编码转换格式,就是用来指导如何将Unicode编码成适合文件存储和网络传输的字节序列的形式(unicode->str)。

像其他的一些编码方式gb2312,gb18030,big5和UTF的作用是一样的,只是编码方式不同。

在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。

BOMBOM=ByteOrderMark是Unicode规范中推荐的标记字节顺序的方法。

比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。

BOM的UTF-8编码是EFBBBF(用UltraEdit打开文本、切换到16进制可以看到)。

所以如果接收者收到以EFBBBF开头的字节流,就知道这是UTF-8编码了。

关于\ufeff字节顺序标记(英语:byte-ordermark,BOM)是位于码点U+FEFF的统一码字符的名称。

当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。

它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。

字符U+FEFF如果出现在字节流的开头,则用来标识该字节流的字节序,是高位在前还是低位在前。

如果它出现在字节流的中间,则表达零宽度非换行空格的意义,用户看起来就是一个空格。

从Unicode3.2开始,U+FEFF只能出现在字节流的开头,只能用于标识字节序,就如它的名称——字节序标记——所表示的一样;除此以外的用法已被舍弃。

取而代之的是,使用U+2060来表达零宽度无断空白。

在UTF-16中,字节顺序标记被放置为文件或字符串流的第一个字符,以标示在此文件或字符串流中,以所有十六比特为单位的字码的尾序(字节顺序)。

如果十六比特单位被表示成大尾序,这字节顺序标记字符在序列中将呈现0xFE,其后跟着0xFF(其中的0x用来标示十六进制)。

如果十六比特单位使用小尾序,这个字节序列为0xFF,其后接着0xFE。

而统一码中,值为U+FFFE的码位被保证将不会被指定成一个统一码字符。

这意味着0xFF、0xFE将只能被解释成小尾序中的U+FEFF(因为不可能是大尾序中的U+FFFE)。

UTF-8则没有字节顺序的议题。

UTF-8编码过的字节顺序标记则被用来标示它是UTF-8的文件。

它只用来标示一个UTF-8的文件,而不用来说明字节顺序。

[1]许多视窗程序(包含记事本)会添加字节顺序标记到UTF-8文件。

然而,在类Unix系统(大量使用文本文件,用于文件格式,用于进程间通信)中,这种做法则不被建议采用。

因为它会妨碍到如解译器脚本开头的Shebang等的一些重要的码的正确处理。

它亦会影响到无法识别它的编程语言。

如gcc会报告源码档开头有无法识别的字符。

而在PHP中,如果没有激活输出缓冲(outputbuffering),它会使得页面内容开始被送往浏览器(即:用户头文件已被提交),这使PHP脚本无法指定用户头文件(HTTPHeader)。

字节顺序标记在UTF-8中被表示为序列EFBBBF,对大部分未准备好处理UTF-8的文本编辑器及网页浏览器而言,在ISO-8859-1的环境中则会显示。

虽然字节顺序标记亦可以用于UTF-32,但这个编码很少用于传输,其规则如同UTF-16。

对于已于IANA注册的字符集UTF-16BE、UTF-16LE、UTF-32BE和UTF-32LE等来说,不可使用字节顺序标记。

文档开头的U+FEFF会被解释成一个(已舍弃的)”零宽度无断空白”,因为这些字符集的名字已决定了其字节顺序。

对于已注册字符集UTF-16和UTF-32来说,一个开头的U+FEFF则用来表示字节顺序。

#csvLikethisarticle?SupporttheauthorwithBuymeacoffeePython更美观输出字典使用Python获取csv的某行、列的数据CommentsyuluoMyvisionMylifeEarthPosts203Categories21Tags48FollowRecents2022-09-01Python更美观输出字典Python2022-08-31Python去除\ufeff、\xa0、\u3000等字符Python2022-08-31使用Python获取csv的某行、列的数据Python2022-08-29在Debian上安装pip包管理器Python2022-08-09Python的Yaml用法PythonYourbrowserisout-of-date!Updateyourbrowsertoviewthiswebsitecorrectly.&npsb;Updatemybrowsernow××



請為這篇文章評分?