`

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

阅读更多

参考:http://www.cnblogs.com/lion.net/archive/2005/02/24/108395.html

 

 

一)需求
很多情况下我们需要知道字节流的编码,比如
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

<script type="text/javascript"></script>

分享到:
评论

相关推荐

    获取文件流字节编码的类(VS.NET)

    本文将详细讲解如何在Visual Studio .NET环境下使用不同的类来获取文件流中的字节编码。 首先,我们需要理解什么是字节编码。字节编码是将字符转换为二进制(字节)表示的方法,如ASCII、UTF-8、UTF-16等。在.NET中...

    获取文本文件编码

    // 获取文件的字节流 byte[] fileBytes = File.ReadAllBytes("EncodeGet.cs"); // 使用Encoding_guesser工具或方法尝试识别编码 Encoding guessedEncoding = EncodingGuess(fileBytes); // 这里需要自定义编码识别...

    获取文件编码格式与文件转码

    - **通过文件头部标识判断**:很多编码格式会在文件开头包含特定的字节序,如UTF-8的BOM(Byte Order Mark)或GBK的两个特定字节。可以读取文件的前几个字节来识别编码。 - **使用工具库**:Java和Android中有多种...

    day20_字节流、字符流、属性集.pdf

    字节流处理的是单个字节的数据,而字符流处理的是Unicode编码的字符。 首先,IO流分为输入流(Input Stream)和输出流(Output Stream)。输入流是从外部数据源(如文件、网络连接等)读取数据到内存,而输出流则是...

    c++文件解码与编码

    在C++编程中,文件的解码与编码是至关重要的概念,它们涉及到数据的存储、传输和处理。...对于初学者来说,从简单的文本文件读写开始,逐步接触更复杂的二进制数据处理和编码转换,是很好的学习路径。

    最简单的X264编码(win7+vs2013)

    3. 获取编码结果:通过`x264_nal_size`和`x264_nal_get`获取编码后的字节流,这些字节流可以直接写入文件或发送网络。 4. 关闭编码器:在完成所有编码工作后,记得调用`x264_encoder_close`来释放资源。 在实际应用...

    获取json和xml形式的流以及以相应的格式输出

    2. 序列化XML文档:使用`TransformerFactory`和`Transformer`将XML文档转换为字节流。 3. 输出到流:将生成的字节流写入到目标输出流。 描述中的“简单快捷”可能是指这些操作可以被封装在简洁的代码片段中,例如...

    ASCII码及UCS2编码转换器,包含中文编解码

    例如,要将ASCII字符串转换为UCS2,可以使用`Encoding.ASCII.GetBytes`方法获取ASCII编码的字节数组,然后用`Encoding.BigEndianUnicode.GetString`将这个字节数组转换为UCS2字符串。相反,将UCS2转换为ASCII,需要...

    cpdetector:自动获取字符流文件编码

    《深入理解Java中的cpdetector:自动检测字符流文件编码》 在Java开发中,处理文本文件时,我们经常需要知道文件的编码格式,以便正确读取和解析文件内容。"cpdetector"是一个实用的工具库,它能自动检测文本文件的...

    查看编码方式

    总的来说,Qt提供了强大的工具来处理各种编码的文本文件,无论是简单的文本读写还是复杂的富文本操作。正确理解和使用这些工具,可以确保你的程序在处理多语言或多编码环境时表现得游刃有余。在开发过程中,始终关注...

    Java实现的两个工具类,解决从键盘输入后,获得各种数据的问题的工具包及把socket字节流中包含的数据转换成字符串

    字节流和字符串之间的转换通常是通过字符编码完成的,如UTF-8。在Java中,可以使用InputStreamReader和BufferedReader将InputStream转换为字符流,然后读取字符串。反之,使用OutputStreamWriter和BufferedWriter将...

    JAVA_字符编码

    这两个类分别用于将字节流转换为字符流和反之。例如,如果你需要从一个使用UTF-8编码的文件读取数据,你可以这样创建`InputStreamReader`: ```java InputStream in = new FileInputStream("file.txt"); ...

    8b_10b编码

    这种编码方式能够解决数字传输中的直流平衡问题,也就是说它能够平衡数据流中的"1"和"0"的数量,从而消除长串相同位的出现,避免由于过量的连续位导致的时钟漂移问题。同时,它还能保证数据流中始终有足够的边沿来...

    C# 获取网页源代码

    示例代码中的`getHtml`函数展示了如何使用`WebClient`的`DownloadData`方法下载网页的字节流,然后使用`Encoding.Default.GetString`将字节流转换为字符串,从而获取到网页的源代码。 ### 2. 使用MSXML2.XMLHTTP...

    Netty进制转换乱码问题

    1. **字符编码与字节流**:在计算机系统中,字符和字节的对应关系是由字符编码(如ASCII、UTF-8、GBK等)定义的。不同的编码方式会导致相同的字符表示为不同的字节序列,如果在发送端和接收端使用了不同的编码方式,...

    java的IO简单实例

    Java的输入/输出(IO)流是...这个简单的例子展示了Java IO流的基本用法,但在实际项目中,根据需求可能会涉及更复杂的流操作,如转换流、对象流、过滤流等。理解并熟练掌握这些基础,将有助于解决各种IO相关的问题。

    java之io流实例

    字符流处理的是Unicode编码的字符,而字节流则处理基本的8位字节数据。这两类流又各自分为输入流(Input Stream)和输出流(Output Stream),分别用于数据的读取和写入。 1. 字节流: - InputStream和...

    IO流讲解-LingRan.pptx

    例如,了解何时使用字节流和字符流,何时需要使用缓冲流,以及如何处理编码问题等。 最后,BIO( Blocking I/O)、NIO(Non-blocking I/O)和AIO(Asynchronous I/O)是Java并发API中关于IO的三种模式。BIO是传统的...

    io流的全部课件io流是java非常重要的一部分,所以给大家分享一下

    InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,允许在不同字符编码之间转换。 3. 对象序列化与反序列化:ObjectInputStream和ObjectOutputStream允许我们将Java对象写入流中,然后在其他地方...

Global site tag (gtag.js) - Google Analytics