如何读取文件的编码信息 c语言

如何读取文件的编码信息 c语言,第1张

UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:

1字节:0xxxxxxx

2字节:110xxxxx

10xxxxxx

3字节:1110xxxx

10xxxxxx

10xxxxxx

4字节:11110xxx

10xxxxxx

10xxxxxx

10xxxxxx

这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。应该指出的是UTF-8字符串的各个字节的取值有一定的范围,并不是所有的值都是有效的UTF-8字符,但是一般的应用的情况下这样的判断在对足够长的字符串及是比较精确了,而且实现也比较简单。具体的字节取值范围可以参见"Unicode

Explained"一书中的6.4.3。

bool

IsUTF8(const

void*

pBuffer,

long

size)

{

bool

IsUTF8

=

true

unsigned

char*

start

=

(unsigned

char*)pBuffer

unsigned

char*

end

=

(unsigned

char*)pBuffer

+

size

while

(start

<

end)

{

if

(*start

<

0x80)

//

(10000000):

值小于0x80的为ASCII字符

{

start++

}

else

if

(*start

<

(0xC0))

//

(11000000):

值介于0x80与0xC0之间的为无效UTF-8字符

{

IsUTF8

=

false

break

}

else

if

(*start

<

(0xE0))

//

(11100000):

此范围内为2字节UTF-8字符

{

if

(start

>=

end

-

1)

break

if

((start[1]

&

(0xC0))

!=

0x80)

{

IsUTF8

=

false

break

}

start

+=

2

}

else

if

(*start

<

(0xF0))

//

(11110000):

此范围内为3字节UTF-8字符

{

if

(start

>=

end

-

2)

break

if

((start[1]

&

(0xC0))

!=

0x80

||

(start[2]

&

(0xC0))

!=

0x80)

{

IsUTF8

=

false

break

}

start

+=

3

}

else

{

IsUTF8

=

false

break

}

}

return

IsUTF8

}

UTF-

16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于

0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF

-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

演示文件为docx文档,内容如下:

源码

运行源码查看报错信息

UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 15: illegal multibyte sequence

上述错误是一种很常见的解码错误,下面介绍该错误的解决方法

把utf-8,gbk等各种编码方式都试了一遍,还是没有解决问题然后仔细看报错信息,根据UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfb in position 14: invalid start byte,猜测文件中某个字节不能解码,打开文件一看,并没有看出什么问题来

open() 函数的第三个参数不是用来接收编码方式的,而是传入一个buffering的值,此处传入了'gbk'字符串,所以系统提示传一个整型

通过调用office的API进行 *** 作,因为在office上能完成的 *** 作,都能通过win32完成,所以我们选择使用win32

(Python3.5 需要安装 win32compat,里面含了 win32 的很多包)

在python3中系统默认编码是unicode,读取文件经常会编码错误导致报错。

首先先确认要读取文件的编码,可这样 *** 作:

记事本打开文本文件,点击“文件”-“另存为”查看编码:

如图显示编码就是当前的文件编码,这里是“utf-8”。

2. 要想用指定编码打开,使用codecs模块

安装模块pip命令:

pip install codecs

3. 使用codecs模块,例如读取test文件内容并打印:

import codecs

f=codecs.open(r"test.txt","r","gbk")

print(f.read())

f.close()

(示例的文件是ANSI所以使用GBK读取)

以上就可以正确读取想要的文件了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12073307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存