在我们的应用中,我们收到的文本文件(.txt,.csv从不同的来源,等等).在阅读时,这些文件有时会包含垃圾,因为文件是在不同的/未知的代码页中创建的.
有没有办法(自动)检测文本文件的代码页?
的detectEncodingFromByteOrderMarks,对StreamReader构造,工程UTF8 和其他的Unicode标文件,但是我正在寻找一种方法来检测代码页,像ibm850,windows1252.
谢谢你的回答,这就是我所做的.
我们收到的文件来自最终用户,他们没有关于代码页的线索.接收者也是最终用户,到目前为止,这是他们对代码页的了解:代码页存在,并且令人讨厌.
解:
在工作中似乎没有一周没有一些编码相关的conniption,灾难或灾难.这个问题通常来自程序员,他们认为他们可以在不指定编码的情况下可靠地处理"文本"文件.但你不能.
因此,已经决定从此以后禁止文件的名称以*.txt或结尾*.text.我们的想法是,这些扩展误导了偶然程序员对编码的沉闷,这会导致处理不当.没有任何扩展几乎会更好,因为至少你知道你不知道你有什么.
但是,我们并不是那么远.相反,您将需要使用以编码结尾的文件名.因此,对于文本文件,例如,这些会是这样README.ascii,README.latin1,README.utf8,等.
对于需要特定扩展的文件,如果可以在文件本身内部指定编码,例如在Perl或Python中,那么您应该这样做.对于像Java源这样的文件,文件内部不存在这样的工具,你将把编码放在扩展名之前,例如SomeClass-utf8.java.
对于输出,UTF-8是非常优选的.
但是对于输入,我们需要弄清楚如何处理我们的代码库中的数千个文件*.txt.我们想重命名所有这些以符合我们的新标准.但我们不可能全都注意它们.所以我们需要一个真正有效的库或程序.
它们有各种ASCII,ISO-8859-1,UTF-8,Microsoft CP1252或Apple MacRoman.虽然我们知道我们可以判断某些东西是否为ASCII,并且我们知道某些东西是否可能是UTF-8,但我们对8位编码感到困惑.因为我们在混合的Unix环境(Solaris,Linux,Darwin)中运行,大多数桌面都是Mac,所以我们有很多烦人的MacRoman文件.这些尤其是一个问题.
一段时间以来,我一直在寻找一种方法来以编程方式确定哪一个
文件在,我还没有找到一个程序或库,可以可靠地区分这三种不同的8位编码.我们可能单独拥有超过一千个MacRoman文件,因此我们使用的任何字符集检测器都必须能够嗅出它们.我看过的任何东西都无法解决问题.我对ICU字符集检测器库寄予厚望,但它无法处理MacRoman.我也看过模块在Perl和Python中做同样的事情,但一次又一次它总是相同的故事:不支持检测MacRoman.
我正在寻找的是一个现有的库或程序,它可靠地确定文件所在的五种编码中的哪一种 - 并且最好不止于此.特别是它必须区分我引用的三个3位编码,尤其是MacRoman.这些文件的英文文本超过99%; 其他语言中有一些,但并不多.
如果它是库代码,我们的语言首选项是它在Perl,C,Java或Python中,并按此顺序.如果它只是一个程序,那么我们并不关心它是什么语言,只要它是完整的源代码,在Unix上运行,并且完全不受阻碍.
有没有其他人有这个随机编码的遗留文本文件的问题?如果是这样,你是如何尝试解决它的,你有多成功?这是我的问题中最重要的方面,但我也对你是否认为鼓励程序员用这些文件所在的实际编码来命名(或重命名)他们的文件感兴趣,这将有助于我们避免将来出现这个问题.曾经尝试过任何人强制执行该体制的基础上,如果是的话,是说成功与否,为什么?
是的,我完全明白为什么鉴于问题的性质,人们无法保证给出明确的答案.对于小文件尤其如此,您没有足够的数据可供使用.幸运的是,我们的文件很少.除随机README文件外,大多数的大小范围为50k到250k,而且许多都更大.任何超过几K的东西都保证是英文的.
问题领域是生物医学文本挖掘,因此我们有时处理广泛且极大的语料库,就像所有PubMedCentral的Open Access资源库一样.一个相当庞大的文件是BioThesaurus 6.0,为5.7千兆字节.这个文件特别烦人,因为它几乎都是UTF-8.但是,我相信,有些numbskull会在其中插入几行8位编码 - 微软CP1252.在你旅行之前需要一段时间.:(
我有一个CSV文件,我希望了解它的编码.Microsoft Excel中是否有一个菜单选项可以帮助我检测它
或者我是否需要使用C#或PHP等编程语言来推断它.
每次我们从不同的分支机构更改.strings文件(用于iOS本地化)时,我们都会遇到冲突.
原因似乎是git将.strings视为二进制文件而不是文本文件.有时它有点烦人,因为git无法自动合并更改,因为它们被认为是二进制格式.
是否有任何git设置会强制它将文件视为文本文件.
我注意到SourceTree和GitLab都无法判断它是文本文件.但XCode本身将能够向我们展示差异.不确定这是否相关.
我是Python的新手,我正在尝试使用下面的脚本读取csv文件.
Past=pd.read_csv("C:/Users/Admin/Desktop/Python/Past.csv",encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
但是,得到错误"UnicodeDecodeError:'utf-8'编解码器无法解码位置35中的字节0x96:无效的起始字节",请帮我解决这里的问题,我在脚本中使用编码认为它会解决错误.
这是我的情况:我需要正确确定哪个字符编码用于给定的文本文件.希望它能正确返回以下类型之一:
enum CHARACTER_ENCODING
{
ANSI,
Unicode,
Unicode_big_endian,
UTF8_with_BOM,
UTF8_without_BOM
};
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以正确地告诉文本文件Unicode,Unicode big endian或者UTF-8 with BOM通过调用以下函数.它还可以正确地确定ANSI给定的文本文件是否最初不是UTF-8 without BOM.问题是,当文本文件是UTF-8 without BOM,以下函数将错误地将其视为ANSI文件.
CHARACTER_ENCODING get_text_file_encoding(const char *filename)
{
CHARACTER_ENCODING encoding;
unsigned char uniTxt[] = {0xFF, 0xFE};// Unicode file header
unsigned char endianTxt[] = {0xFE, 0xFF};// Unicode big endian file header
unsigned char utf8Txt[] = {0xEF, 0xBB};// UTF_8 file header
DWORD dwBytesRead = 0;
HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, …Run Code Online (Sandbox Code Playgroud)