lion

我一直以为悲伤是一种美丽,一种壮丽,这世界让我如此失望,我经不起这风吹雨打的折磨,我寻找的是悲惨的结局,我追寻的是哭里的笑声,默默地完成生命的剩余……如果有来生,我不会选择以悲伤为开始,我会选择以美丽为结局......
随笔 - 30, 文章 - 9, 评论 - 553, 引用 - 7
数据加载中……

字节流编码获取原来这么复杂,但也很简单

一)需求
很多情况下我们需要知道字节流的编码,比如
1) 使用编辑器打开文本文件的时候,编辑器需要识别文本文件的各种编码
2) 上传文件后,分析上传文件字节流需要知道它的编码
3) 读取某个web页面的源代码,并要输出时,需要知道正确的编码才能输出正确的内容

二)探讨
最初和同事讨论如何获取文件/流/字节是否是utf8编码时,发现c#并没有直接的函数,但在SDK中发现UTF8的开头三个字节是“0xEF 0xBB 0xBF”(称为BOM--Byte Order Mark),Unicode文件的开头两个字节是“0xFF 0xFE”,UTF16SmallEndian文件的开头两个字节是“0xFE 0xFF”,于是写了一个简单的函数去解决,由于没有时间做足够的测试,总觉得会有问题.......

/// <summary>
  
/// 解析 byte 数组是什么样的编码
  
/// </summary>
  
/// <param name="enc">要传回的编码类型</param>
  
/// <param name="buff">要解析的byte数组</param>
  
/// <remarks>
  
/// 以下示例演示了如何使用 <see cref="GetEncoding"/>方法
  
/// <code>
  
///  if(Request.Files.Count!=0)
  
///  {    
  
///   //获取上传的文件
  
///   HttpPostedFile pf   = Request.Files[0];
  
///   int fileLength  = (int)pf.InputStream.Length;
  
///   //存储上传文件的字节数组
  
///   byte[] buff   = new byte[fileLength];     
  
///   pf.InputStream.Read(buff,0,fileLength); 
  
///   pf.InputStream.Close();
  
///   Encoding enc = null;
  
///   GetEncoding(out enc,buff);     
  
///   Response.Write("编码:"+enc.EncodingName);
  
///   Response.Write("<br />");
  
///   Response.Write("内容:"+enc.GetString(buff));
  
///  }
  
/// </code>
  
/// </remarks>

  void GetEncoding(out Encoding enc,byte[] buff)
  
{
   
bool flag   = false;
   
//用于测试的编码
   byte[] testencbuff = new byte[0];   
   
int fileLength  = buff.Length;
   
//判断上传的文件的编码是否是Unicode
   enc     = Encoding.Unicode;
   testencbuff   
= enc.GetPreamble();    
   
if(fileLength>testencbuff.Length && testencbuff[0== buff[0&& testencbuff[1]==buff[1])
   
{
    flag 
= true;     
   }

   
//判断上传的文件的编码是否是UTF8
   if(!flag)
   
{
    enc     
= Encoding.UTF8;
    testencbuff   
= enc.GetPreamble();
    
if(fileLength>testencbuff.Length && testencbuff[0== buff[0&& testencbuff[1]==buff[1&& testencbuff[2]==buff[2])
    
{
     flag 
= true
    }

   }

   
//判断上传的文件的编码是否是BigEndianUnicode
   if(!flag)
   
{
    enc     
= Encoding.BigEndianUnicode;
    testencbuff   
= enc.GetPreamble();
    
if(fileLength>testencbuff.Length && testencbuff[0== buff[0&& testencbuff[1]==buff[1])
    
{
     flag 
= true
    }

   }
 
   
if(!flag)
   
{
    enc     
= Encoding.Default;
   }

  }


问题出现了,第二天同事告诉我,不是所有的UTF8编码的文件都有BOM信息,那如何解决呢?他先找到了答案 字节流编码获取原来这么复杂 (我也在google和baidu上搜索过,发现C#并没有很好的解决方案)
以下是两篇相关解决问题的文章(java)
http://dev.csdn.net/Develop/article/10/10961.shtm
http://dev.csdn.net/Develop/article/10/10962.shtm

java代码很容易移植到.NET上,那我就来为大家铺条路...
代码有2400多行,请在这里下载代码:下载代码


在移植代码的过程中感谢以下朋友的参与:
playyuer

posted on 2005-02-24 09:19 Lion 阅读(5546) 评论(10)  编辑 收藏 所属分类: DotNet

评论

#1楼    回复  引用  查看    

原来这么复杂,先收藏了以后用得着
2005-02-24 10:37 | myrat      

#2楼    回复  引用    

下载不到,给我发一份吧,谢谢
fangjing3@msn.com
2005-02-24 16:13 | fangjing [未注册用户]

#3楼    回复  引用  查看    

现在可以下了
2005-03-11 09:22 | lion      

#4楼    回复  引用    

出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar

#5楼    回复  引用  查看    

还是下不了哦,老大
2008-05-19 16:34 | 代码乱了      

#6楼    回复  引用    

下载不了
2008-07-03 12:00 | on [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-02-24 09:21 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: