设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 6390|回复: 17

C# 获取文件编码   [复制链接]

Rank: 7Rank: 7Rank: 7

俊俊 实名认证  发表于 2011-7-27 13:09:07 |显示全部楼层
本帖最后由 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.         {}
复制代码
游客,如果您要查看本帖隐藏内容请回复
2

查看全部评分

Rank: 7Rank: 7Rank: 7

俊俊 实名认证  发表于 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. }
复制代码

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

混混@普宁.中国 实名认证  发表于 2011-7-27 14:02:40 |显示全部楼层
己下载,强烈推荐!

使用道具 举报

Rank: 7Rank: 7Rank: 7

俊俊 实名认证  发表于 2011-7-27 14:20:14 |显示全部楼层
混混@普宁.中国 发表于 2011-7-27 14:02
己下载,强烈推荐!

首先感谢评分,
只是不明白,你怎么忽然对C#感兴趣了???

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

混混@普宁.中国 实名认证  发表于 2011-7-27 16:25:25 |显示全部楼层
cjqq0218 发表于 2011-7-27 14:20
首先感谢评分,
只是不明白,你怎么忽然对C#感兴趣了???

俺只想看看怎样判断编码

C# 不 C# 的没关系

使用道具 举报

Rank: 1

天殛 发表于 2012-2-3 11:12:49 |显示全部楼层
回复来看看,,,,,,,

使用道具 举报

Rank: 7Rank: 7Rank: 7

奔波儿灞 发表于 2012-3-31 17:24:29 |显示全部楼层
师傅出马一个顶俩

使用道具 举报

Rank: 1

一阵风 发表于 2012-9-15 18:22:27 |显示全部楼层
这个有点复杂,但下载是必须的。

使用道具 举报

Rank: 1

不打架吧 发表于 2012-11-11 14:30:55 |显示全部楼层
看看如何

使用道具 举报

Rank: 1

刀客 发表于 2012-12-20 18:28:33 |显示全部楼层

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-4-19 06:18 , Processed in 1.124301 second(s), 18 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部