C#学习教程:C#:有没有办法发现文件的字符集编码使用了什么?分享


C#:有没有办法发现文件的字符集编码使用了什么?

有没有办法发现编码文件的字符集是什么?

可靠地执行此操作的唯一方法是在文本文件的开头查找字节顺序标记 。 (此blob更一般地表示所使用的字符编码的字节顺序,但也表示编码 – 例如UTF8,UTF16,UTF32)。 不幸的是,这种方法仅适用于基于Unicode的编码,在此之前没有任何内容(必须使用更不可靠的方法)。

StreamReader类型支持检测这些标记以确定编码 – 您只需将标志传递给参数:

 new System.IO.StreamReader("path", true) 

然后,您可以检查stremReader.CurrentEncoding的值以确定文件使用的编码。 但请注意,如果不存在字节编码标记,则CurrentEncoding将默认为Encoding.Default

请参阅: 在.NET中检测文件编码

来自Msdn :

没有很好的方法来检测任意ANSI代码页,尽管有一些尝试是基于文本中间某些字节序列的概率来做到这一点。 我们不在StreamReader中尝试。 一些文件格式(如XML或HTML)可以在文件的第一行指定字符集,因此Web浏览器,数据库和类(如XmlTextReader)可以正确读取这些文件。 但是许多文本文件没有内置这种类型的信息。

100%的可靠性无法做到这一点。 您必须决定您习惯的成本与准确性之间的权衡。 我在这篇回复中讨论了许多可能的算法(有利弊): PowerShell搜索脚本忽略了二进制文件

正如理查德所说,没有完全可靠的方法来做到这一点。 但是,这里有一些可能有用的链接:

http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=469

http://msdn.microsoft.com/en-us/netframework/aa569610.aspx#Question2

我在C ++中编写了一段时间,它变得相当复杂。 这就是我所做的(接受匹配的第一个):

这可以解决许多无BOM的文本文件,但对使用自定义ANSI代码页存储的文本没有帮助。

对于这些,没有可能的确定性检测。 例如,使用“东欧”编码保存并在具有“西欧”默认代码页的计算机上加载的文件将是乱码。

在这种情况下唯一可能的帮助是让用户选择代码页(根据用户体验,最好的是让用户在看到文本时更改假定的编码)。

它在测试集上运行正常但当然可能存在误解,如果不可能的话。

代码页可以通过文本的统计分析来确定(例如,包含非ASCII字符的字符对和三元组的频率,或不同语言的单词列表,但我没有找到任何合适的方法来尝试。

Win32 IsTextUnicode非常糟糕,它仅检查UTF-16,并且可能是记事本中“丛林隐藏事实”背后的罪魁祸首。

正如peterchen所写,你应该在Notepad.exe中写下“bush hide the facts”,保存并重新打开它,看看检测编码有多困难。

http://en.wikipedia.org/wiki/Bush_hid_the_facts

要添加到可能有用的链接列表中,这是一个非常小的类,我把它放在一起检测unicode编码(有或没有BOM)与默认代码页(通常是Windows-1252,在.Net中标记为“ASCII”,如Encodings.ASCII) :

http://www.architectshack.com/TextFileEncodingDetector.ashx

它比StreamReader默认function更进一步,基本上正是@peterchen在上面的回答中所描述的,除了这个C#代码:

对不起,这个答案太晚了 – 我最近才清理课程并将其上线。

上述就是C#学习教程:C#:有没有办法发现文件的字符集编码使用了什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1269787.html

(0)
上一篇 1天前
下一篇 1天前

精彩推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注