在我们的应用中,我们收到的文本文件(.txt,.csv从不同的来源,等等).在阅读时,这些文件有时会包含垃圾,因为文件是在不同的/未知的代码页中创建的.
有没有办法(自动)检测文本文件的代码页?
的detectEncodingFromByteOrderMarks,对StreamReader构造,工程UTF8 和其他的Unicode标文件,但是我正在寻找一种方法来检测代码页,像ibm850,windows1252.
谢谢你的回答,这就是我所做的.
我们收到的文件来自最终用户,他们没有关于代码页的线索.接收者也是最终用户,到目前为止,这是他们对代码页的了解:代码页存在,并且令人讨厌.
解:
我的程序必须读取使用各种编码的文件.它们可以是ANSI,UTF-8或UTF-16(大或小端).
当BOM(字节顺序标记)出现时,我没有问题.我知道文件是UTF-8还是UTF-16 BE或LE.
我想假设没有BOM文件是ANSI.但我发现我正在处理的文件经常缺少BOM.因此,没有BOM可能意味着该文件是ANSI,UTF-8,UTF-16 BE或LE.
当文件没有BOM时,扫描某些文件并最准确地猜测编码类型的最佳方法是什么?如果文件是ANSI,我希望接近100%的时间,如果是UTF格式,我希望接近100.
我正在寻找一种通用的算法来确定这一点.但实际上我使用Delphi 2009,它知道Unicode并且有一个TEncoding类,所以特定的东西将是一个奖励.
回答:
ShreevatsaR的回答让我在Google上搜索"通用编码检测器delphi",这让我感到惊讶,因为这个帖子在活着只有大约45分钟后被列为#1位置!这是快速googlebotting !! 同样令人惊讶的是Stackoverflow如此迅速地进入第一名.
Google的第二个条目是Fred Eaker关于字符编码检测的博客文章,列出了各种语言的算法.
我发现在该页面上提到了Delphi,它让我直接进入SourceForge的Free OpenSource ChsDet Charset Detector,这是用Delphi编写的,基于Mozilla的i18n组件.
太棒了!谢谢所有回复的人(全+1),谢谢ShreevatsaR,再次感谢Stackoverflow,帮助我在不到一个小时内找到答案!
我正在研究ac #project,其中一些数据包含编码无法识别的字符.它们显示如下:
"有些文字 里面有特殊的 符号".
我无法控制编码过程,数据也来自各种来源和各种格式的文件.我希望能够标记包含错误或不完整字符的数据.现在我能够以这种方式检测它们:
if(myString.Contains("?"))
{
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
虽然它确实有效,但在Contains函数中直接使用奇怪的符号并不合适.有没有更清洁的方法来做到这一点?
编辑:
在与负责阅读文件的团队核对后,他们就是这样做的:
var sr = new StreamReader(filePath, true);
var content = sr.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)
传递true作为StreamReader的第二个参数应该从文件的BOM中检测编码,并使用它来读取内容.它并不总是有效,因为有些文件不承载这些信息,因此他们的数据读取错误的原因.
我们已经进行了一些测试,并且使用它StreamReader(filePath, Encoding.Default)似乎适用于大多数(如果不是所有)我们遇到问题的文件.预计,之前工作的文件不再有效,因为它们不使用默认编码.
因此,对我们来说最好的解决方案是执行以下操作:读取尝试检测其编码的文件,然后如果不成功则使用默认编码再次读取它.
但问题仍然存在:在尝试检测文件的编码后,如果数据读取不正确,我们如何检查?
我正在阅读各种格式和语言的文件,我目前正在使用一个小编码库来尝试检测正确的编码(http://www.codeproject.com/KB/recipes/DetectEncoding.aspx).
这很不错,但偶尔也会错过.(多语言文件)
我的大多数潜在用户对编码的理解很少(我希望最好的是"它与字符有关")并且不太可能在列表中选择正确的编码,所以我想让他们循环通过不同的编码,直到找到正确的编码只需点击一个按钮.
显示问题?点击这里尝试不同的编码!(那就是这个概念)
实现类似的东西最好的方法是什么?
编辑:看起来我没有表达得足够清楚.通过"循环编码",我不是指"如何循环编码?"
我的意思是"如何让用户按顺序尝试不同的编码而不重新加载文件?"
这个想法更像是这样的:假设文件加载了错误的编码.显示一些奇怪的字符.用户将单击"下一编码"或"先前编码"按钮,并且将以不同的编码转换该字符串.用户只需要一直点击,直到找到正确的编码.(无论哪种编码看起来对用户有用都会很好).只要用户可以点击"下一步",他就有合理的机会解决他的问题.
我到目前为止所发现的涉及使用当前编码将字符串转换为字节,然后将字节转换为下一个编码,将这些字节转换为字符,然后将字符串转换为字符串......可行,但我想知道是否存在这是一种更简单的方法.
例如,如果有一个方法可以读取字符串并使用不同的编码返回它,例如"render(string,encoding)".
非常感谢您的回答!
我有一个字节数组,我从FileStream.Read返回,我想把它变成一个字符串.我不是100%肯定编码 - 它只是我保存到磁盘的文件 - 我该如何进行转换?是否有一个.NET类读取字节顺序标记,可以为我找出编码?