Encoding 如何检测八度音阶中的文件编码?
我正在处理许多XML文件,其中一些是UTF-8,而大多数是ANSI 在UTF-8文件中,XML头声明:Encoding 如何检测八度音阶中的文件编码?,encoding,octave,Encoding,Octave,我正在处理许多XML文件,其中一些是UTF-8,而大多数是ANSI 在UTF-8文件中,XML头声明: <?xml version="1.0" encoding="ISO8859-1" ?> 然而,这些信息是错误的 这产生的问题是,我使用unicode2ntive生成正确的XLS文件,当文件采用UTF-8编码时,会生成错误的输出 如何以编程方式检测每个文件的真实编码 在文本编辑器的帮助下手动查找它们不是一个可行的选择,因为有数百个文件,我的解决方案必须处理更多我无法访问的文件。
<?xml version="1.0" encoding="ISO8859-1" ?>
然而,这些信息是错误的
这产生的问题是,我使用unicode2ntive
生成正确的XLS文件,当文件采用UTF-8编码时,会生成错误的输出
如何以编程方式检测每个文件的真实编码
在文本编辑器的帮助下手动查找它们不是一个可行的选择,因为有数百个文件,我的解决方案必须处理更多我无法访问的文件。我为Windows 10找到的缓和解决方案,而我找不到在纯倍频程中执行此操作的正确方法:
[~, output] = system(['file --mime-encoding "', fileAddress, '"']);
encoding = strsplit(output)(columns(strsplit(output, ' '))){1};
if strcmp('utf-8', encoding)
sheet(1, 1) = {strcat('', unicode2native(myText, 'ISO-8859-1'))};
else
sheet(1, 1) = {myText};
endif
一般来说,没有简单的方法可以做到这一点:因为给定的文件可能是多个编码中的有效序列,所以检测字符编码需要使用能够感知自然语言特征(如字符频率、常用词等)的启发式方法 Octave对此没有直接的支持。因此,您需要使用外部程序或库。选项包括、和其他。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\u bytes=unicode2native(file\u contents,'UTF-8')
检查文件是否为纯八度有效的UTF-8,并查看utf8\u bytes
输出是否与直接将file\u contents
转换为uint8
相同。如果这不起作用,您可以回过头来使用Java的字符编码支持(并且您可以在任何支持Java的倍频程构建上使用Java标准库,而无需加载外部JAR文件)
如果您的所有输入文件都是UTF-8或严格意义上的7位ASCII,那么您可以将它们都视为UTF-8,因为7位ASCII是UTF-8的有效子集。请澄清您的问题。“正确的XLS文件”指的是旧的Microsoft Excel文件格式吗?如果编码键/值对不正确,由哪个角色扮演?您是否在POSIX系统上,可以在系统调用中调用
ìconf
或chardet
?为什么首先要使用GNU倍频程?正确的XLS文件是一个不会显示奇怪字符的XLS文件。我使用Octave生成描述性统计数据,并将汇总数据导出到Excel。我正在使用Windows,但脚本可能由其他操作系统上的人执行。我在Windows上的系统
调用中找到了一种使用文件
工具的方法,但我想知道正确的、纯八度的方法。