我正在处理许多XML文件,其中一些是UTF-8,而大多数是ANSI。
在UTF-8文件中,XML标头指出:
<?xml version="1.0" encoding="ISO8859-1" ?>
但是这些信息是错误的。
生成的问题是我使用unicode2native
生成正确的XLS文件,当文件经过UTF-8编码时会生成错误的输出。
如何以编程方式检测每个文件的真实编码?
借助文本编辑器手动定位它们是不可行的选择,因为有数百个文件,而且我的解决方案必须可以处理更多我无权访问的文件。
答案 0 :(得分:2)
通常没有简便的方法:由于给定文件可能是多种编码中的有效序列,因此检测字符编码需要使用了解自然语言特征(例如字符频率,常用词等)的启发式方法。上。
八度对此没有直接支持。因此,您需要使用外部程序或库。选项包括ICU4C,compact_enc_det,chardet,juniversalchardet等。 chardet可能是最容易使用的,因为您可以安装它并作为外部命令来调用它,而不是使用库来构建自定义程序或oct文件。或juniversalchardet,因为如果您具有支持Java的Octave构建,则可以很容易地从Octave代码中插入和使用Java库。
如果确实输入文件全部是ANSI(Windows 1252 / ISO 8859-1)或UTF-8,并且没有其他编码,那么您也许就可以摆脱困境检查每个文件的内容以查看其是否为有效的UTF-8字符串,并假定所有无效的UTF-8字符串均为ANSI。只有某些字节序列才是有效的UTF-8编码,因此很有可能ANSI编码的文件不是有效的UTF-8。我认为您可以通过在文件上进行utf8_bytes = unicode2native(file_contents, 'UTF-8')
并检查utf8_bytes
的输出是否等同于将file_contents
直接转换为{{ 1}}。如果那不起作用,则可以退回使用Java的字符编码支持(并且可以在任何启用Java的Octave构建中使用Java标准库的东西,而不必加载外部JAR文件)。
如果所有输入文件均为UTF-8或严格为 7位 ASCII,则可以将它们全部视为UTF-8,因为7位ASCII是以下内容的有效子集: UTF-8。
答案 1 :(得分:0)
我为Windows 10找到的姑息解决方案,但我找不到在纯Octave中执行此操作的正确方法:
{{1}}