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 codecs3. 使用codecs模块,例如读取test文件内容并打印:
import codecsf=codecs.open(r"test.txt","r","gbk")
print(f.read())
f.close()
(示例的文件是ANSI所以使用GBK读取)
以上就可以正确读取想要的文件了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)