Scripts 学盟

标题: C# 获取文件编码 [打印本页]

作者: 俊俊    时间: 2011-7-27 13:09:07     标题: C# 获取文件编码

本帖最后由 cjqq0218 于 2011-7-27 13:27 编辑

文件编程中,最难的就是编码问题了
由于篇幅太长,我只将关键的函数列出,代码部分请在本文结尾下载
  1.         internal static int[][] GBFreq = new int[94][];
  2.         internal static int[][] GBKFreq = new int[126][];
  3.         internal static int[][] Big5Freq = new int[94][];
  4.         internal static int[][] EUC_TWFreq = new int[94][];

  5.         internal static string[] nicename = new string[]
  6.    {
  7.     "GB2312", "GBK", "HZ", "Big5", "CNS 11643"
  8.     , "ISO 2022CN", "UTF-8", "Unicode", "ASCII", "OTHER"
  9.    };
复制代码
  1.         /// <summary>
  2.         /// 从指定的 <see cref="Uri"/> 中判断编码类型
  3.         /// </summary>
  4.         /// <param name="testurl">要判断的 <see cref="Uri"/> </param>
  5.         /// <returns>返回编码类型("GB2312", "GBK", "HZ", "Big5", "CNS 11643", "ISO 2022CN", "UTF-8", "Unicode", "ASCII", "OTHER")</returns>
  6.         /// <example>
  7.         /// 以下示例演示了如何调用 <see cref="GetEncodingName"/> 方法:
  8.         /// <code>
  9.         ///  IdentifyEncoding ide = new IdentifyEncoding();
  10.         ///  Response.Write(ide.GetEncodingName(new Uri("http://china5.nikkeibp.co.jp/china/news/com/200307/pr_com200307170131.html")));  
  11.         /// </code>
  12.         /// </example>
  13.         public virtual string GetEncodingName(System.Uri testurl)
  14.         {}
复制代码
  1.          /// <summary>
  2.         /// 从指定的 <see cref="System.IO.FileInfo"/> 中判断编码类型
  3.         /// </summary>
  4.         /// <param name="testfile">要判断的 <see cref="System.IO.FileInfo"/> </param>
  5.         /// <returns>返回编码类型("GB2312", "GBK", "HZ", "Big5", "CNS 11643", "ISO 2022CN", "UTF-8", "Unicode", "ASCII", "OTHER")</returns>
  6.         /// <example>
  7.         /// 以下示例演示了如何调用 <see cref="GetEncodingName"/> 方法:
  8.         /// <code>
  9.         ///  IdentifyEncoding ide = new IdentifyEncoding();
  10.         ///  Response.Write(ide.GetEncodingName(new System.IO.FileInfo(@"C:\test.txt")));  
  11.         /// </code>
  12.         /// </example>
  13.         public virtual string GetEncodingName(System.IO.FileInfo testfile)
  14.         {}
复制代码
  1.         /// <summary>
  2.         /// 从指定的 <see cref="sbyte"/> 字节数组中判断编码类型
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="System.IO.FileInfo"/> </param>
  5.         /// <returns>返回编码类型("GB2312", "GBK", "HZ", "Big5", "CNS 11643", "ISO 2022CN", "UTF-8", "Unicode", "ASCII", "OTHER")</returns>
  6.         /// <example>
  7.         /// 以下示例演示了如何调用 <see cref="GetEncodingName"/> 方法:
  8.         /// <code>
  9.         ///  IdentifyEncoding ide = new IdentifyEncoding();
  10.         ///  Response.Write(ide.GetEncodingName(IdentifyEncoding.ToSByteArray(System.Text.Encoding.GetEncoding("gb2312").GetBytes("Lion互动网络(www.lionsky.net)"))));
  11.         /// </code>
  12.         /// </example>
  13.         public virtual string GetEncodingName(sbyte[] rawtext)
  14.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是GB2312编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int GB2312Probability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是GBK编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int GBKProbability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是HZ编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int HZProbability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是BIG5编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int BIG5Probability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是CNS11643(台湾)编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int ENCTWProbability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是ISO2022CN编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int ISO2022CNProbability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是UTF8编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int UTF8Probability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是Unicode编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int UnicodeProbability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 判断是ASCII编码的可能性
  3.         /// </summary>
  4.         /// <param name="rawtext">要判断的 <see cref="sbyte"/> 字节数组</param>
  5.         /// <returns>返回 0 至 100 之间的可能性</returns>
  6.         internal virtual int ASCIIProbability(sbyte[] rawtext)
  7.         {}
复制代码
  1.         /// <summary>
  2.         /// 初始化必要的条件,这里是放字典的~
  3.         /// </summary>
  4.         internal virtual void Initialize_Frequencies()
  5.         {}
复制代码
  1.         /// <summary>从流读取字节序列,并将此流中的位置提升读取的字节数.</summary>
  2.         /// <param name="sourceStream">要读取的流.</param>
  3.         /// <param name="target">字节数组。此方法返回时,该缓冲区包含指定的字符数组,该数组的 start 和 (start + count-1) 之间的值由从当前源中读取的字节替换。</param>
  4.         /// <param name="start">buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。.</param>
  5.         /// <param name="count">要从当前流中最多读取的字节数。</param>
  6.         /// <returns>读入缓冲区中的总字节数。如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。</returns>
  7.         /// <exception cref="ArgumentException">start 与 count 的和大于缓冲区长度。</exception>
  8.         /// <exception cref="ArgumentNullException">target 为空引用(Visual Basic 中为 Nothing)。</exception>
  9.         /// <exception cref="ArgumentOutOfRangeException">offset 或 count 为负。</exception>
  10.         /// <exception cref="System.IO.IOException">发生 I/O 错误。</exception>
  11.         /// <exception cref="NotSupportedException">流不支持读取。</exception>
  12.         /// <exception cref="ObjectDisposedException">在流关闭后调用方法。</exception>
  13.         public static int ReadInput(System.IO.Stream sourceStream, ref sbyte[] target, int start, int count)
  14.         {}
复制代码
  1.         /// <summary>从字符系列读取字节序列,并将此字符系列中的位置提升读取的字节数。</summary>
  2.         /// <param name="sourceTextReader">要读取的流。</param>
  3.         /// <param name="target">字节数组。此方法返回时,该缓冲区包含指定的字符数组,该数组的 start 和 (start + count-1) 之间的值由从当前源中读取的字节替换。</param>
  4.         /// <param name="start">buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。.</param>
  5.         /// <param name="count">要从当前流中最多读取的字节数。</param>
  6.         /// <returns>读入缓冲区中的总字节数。如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。</returns>
  7.         /// <exception cref="ArgumentException">start 与 count 的和大于缓冲区长度。</exception>
  8.         /// <exception cref="ArgumentNullException">target 为空引用(Visual Basic 中为 Nothing)。</exception>
  9.         /// <exception cref="ArgumentOutOfRangeException">offset 或 count 为负。</exception>
  10.         /// <exception cref="System.IO.IOException">发生 I/O 错误。</exception>
  11.         /// <exception cref="NotSupportedException">流不支持读取。</exception>
  12.         /// <exception cref="ObjectDisposedException">在流关闭后调用方法。</exception>
  13.         public static int ReadInput(System.IO.TextReader sourceTextReader, ref sbyte[] target, int start, int count)
  14.         {}
复制代码

作者: 俊俊    时间: 2011-7-27 13:27:15

  1. //测试主程序

  2. class AppTest
  3. {
  4.     [STAThread]
  5.     public static void Main(string[] argc)   
  6.     {        
  7.         Microshaoft.Text.IdentifyEncoding sinodetector;        
  8.         string result = null;      
  9.         argc = new string[1];     
  10.         //argc[0] = "c:\\chinesedata\\codeconvert\\voaunit.txt";     
  11.         argc[0] = "http://china5.nikkeibp.co.jp/china/news/com/200307/pr_com200307170131.html";   
  12.         sinodetector = new Microshaoft.Text.IdentifyEncoding();      
  13.         if (argc[0].StartsWith("http://") == true)   
  14.         {      
  15.             try      
  16.             {         
  17.                 result = sinodetector.GetEncodingName(new System.Uri(argc[0]));   
  18.             }      
  19.             catch (System.Exception e)   
  20.             {            
  21.                 System.Console.Error.WriteLine("Bad URL " + e.ToString());   
  22.             }   
  23.         }   
  24.         else   
  25.         {      
  26.             //result = sinodetector.detectEncoding(new File(argc[0]));   
  27.         }     
  28.         //读文件 
  29.         StreamReader reader = new StreamReader(filePath, sinodetector.GetEncoding(sinodetector.GetEncodingName(filePath));
  30.         //后面可根据文件路径获取文件编码   
  31.         System.Console.Out.WriteLine(result);
  32.     }
  33. }
复制代码

作者: 混混@普宁.中国    时间: 2011-7-27 14:02:40

己下载,强烈推荐!
作者: 俊俊    时间: 2011-7-27 14:20:14

混混@普宁.中国 发表于 2011-7-27 14:02
己下载,强烈推荐!

首先感谢评分,
只是不明白,你怎么忽然对C#感兴趣了???
作者: 混混@普宁.中国    时间: 2011-7-27 16:25:25

cjqq0218 发表于 2011-7-27 14:20
首先感谢评分,
只是不明白,你怎么忽然对C#感兴趣了???

俺只想看看怎样判断编码

C# 不 C# 的没关系


作者: 天殛    时间: 2012-2-3 11:12:49

回复来看看,,,,,,,
作者: 奔波儿灞    时间: 2012-3-31 17:24:29

师傅出马一个顶俩
作者: 一阵风    时间: 2012-9-15 18:22:27

这个有点复杂,但下载是必须的。
作者: 不打架吧    时间: 2012-11-11 14:30:55

看看如何
作者: 刀客    时间: 2012-12-20 18:28:33


作者: TourEx程序-许    时间: 2012-12-27 10:25:53

正是我想要的,谢谢
作者: 金廷    时间: 2012-12-29 12:37:23

xxxxxx
作者: span    时间: 2013-1-22 10:42:25

  正好需要。
作者: 那个谁    时间: 2013-1-22 14:46:04

一下冒出这么多书童?
作者: FlamesTsui    时间: 2013-1-24 21:12:27

  下载来看看呢
作者: bac2001    时间: 2013-1-31 19:56:13

支持~~~研究一下~
作者: 混混@普宁.中国    时间: 2013-5-16 11:48:10

那个谁 发表于 2013-1-22 14:46
一下冒出这么多书童?

编码问题烦恼了很多人
作者: 似水流年    时间: 2014-1-24 21:19:49

学习中中




欢迎光临 Scripts 学盟 (http://www.iscripts.org/) Powered by Discuz! X2