Character encoding 检查字节是否在Python中产生有效的ISO 8859-15(拉丁语)

Character encoding 检查字节是否在Python中产生有效的ISO 8859-15(拉丁语),character-encoding,Character Encoding,我想测试从文件中提取的一串字节是否会产生有效的编码文本。 我遇到的第一件事是关于UTF-8验证的类似案例: 基于此,我认为我做了一些与ISO-8859-15类似的事情是聪明的。请参阅以下演示代码: #/usr/bin/env python # def isValidISO885915(字节): #测试字节是否导致有效的ISO-8859-15 尝试: 字节。解码('iso-8859-15','strict') 返回(真) 除UNICEDECODEERROR外: 返回(假) def main():

我想测试从文件中提取的一串字节是否会产生有效的编码文本。 我遇到的第一件事是关于UTF-8验证的类似案例:

基于此,我认为我做了一些与ISO-8859-15类似的事情是聪明的。请参阅以下演示代码:

#/usr/bin/env python
#
def isValidISO885915(字节):
#测试字节是否导致有效的ISO-8859-15
尝试:
字节。解码('iso-8859-15','strict')
返回(真)
除UNICEDECODEERROR外:
返回(假)
def main():
#测试字节(ISO-8859-15中未定义字节x95!)
字节=b'\x4A\x70\x79\x6C\x79\x7A\x65\x72\x20\x64\x95\x6D\x6F\xFF'
isValidLatin=isvalidis885915(字节)
打印(isValidLatin)
main()

但是,即使x95在ISO-8859-15中不是有效的代码点,运行此命令仍返回True!我是不是忽略了一些很明显的东西?(顺便说一句,我在Python2.7.4和3.3中尝试了这一点,结果在这两种情况下都是相同的)。

我想我自己已经找到了一个可行的解决方案,所以我不妨分享一下

查看ISO8859-15()的代码页布局,我只需要检查是否存在代码点00-1f和7f-9f。这些都与法律有关

在我的项目中,我已经在使用基于的东西从字符串(C0+C1)中删除控制字符。因此,以此为基础,我得出了以下结论:

#/usr/bin/env python
#
导入Unicode数据
def RemoveControl字符(字符串):
#从字符串中删除控制字符
#基于:https://stackoverflow.com/a/19016117/1209004
#制表符、换行符和返回是C0的一部分,但在XML中是允许的
allowedChars=[u'\t',u'\n',u'\r']
返回“.join”(ch表示字符串中的ch,如果
unicodedata.category(ch)[0]!=“C”或允许字符中的ch)
def isValidISO885915(字节):
#测试字节是否导致有效的ISO-8859-15
#将字节解码为字符串
尝试:
字符串=字节。解码(“iso-8859-15”,“严格”)
除:
#解码错误时为空字符串
string=“”
#删除控制字符,并将结果与
#输入字符串
如果RemoveControl字符(字符串)=字符串:
isValidLatin=True
其他:
isValidLatin=False
返回(isValidLatin)
def main():
#测试字节(ISO-8859-15中未定义字节x95!)
字节=b'\x4A\x70\x79\x6C\x79\x7A\x65\x72\x20\x64\x95\x6D\x6F\xFF'
打印(IS885915(字节))
main()

可能有更优雅的/Python式的方法来实现这一点,但它似乎做到了这一点,并且可以与Python 2.7和3.3一起使用。

刚刚更新了它,以便排除制表符、换行符和回车符。