An extension method for converting a byte array to a string (reading its BOM)

Below is an extension method that adapts Rick Strahl's code (and the comments too) to stop you having to guess or read the byte order mark of a byte array or text file each time you convert it to a string.

The commonest way of doing this is usually with

byte[] buffer = File.ReadAllBytes(@"C:\file.txt");
System.Text.Encoding.xxx.GetString(buffer)

where xxx is Ascii, Unicode, or UTF8, or Default.

but the snippet below allows you to simply do

byte[] buffer = File.ReadAllBytes(@"C:\file.txt");
string content = buffer.GetString();

Here's the method

public static class Extensions
{
    /// <summary>
    /// Converts a byte array to a string, using its byte order mark to convert it to the right encoding.
    /// Original article: http://www.west-wind.com/WebLog/posts/197245.aspx
    /// </summary>
    /// <param name="buffer">An array of bytes to convert</param>
    /// <returns>The byte as a string.</returns>
    public static string GetString(this byte[] buffer)
    {
    	if (buffer == null || buffer.Length == 0)
    		return "";

    	// Ansi as default
    	Encoding encoding = Encoding.Default;		

    	/*
    		EF BB BF		UTF-8 
    		FF FE UTF-16	little endian 
    		FE FF UTF-16	big endian 
    		FF FE 00 00		UTF-32, little endian 
    		00 00 FE FF		UTF-32, big-endian 
    	 */

    	if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
    		encoding = Encoding.UTF8;
    	else if (buffer[0] == 0xfe && buffer[1] == 0xff)
    		encoding = Encoding.Unicode;
    	else if (buffer[0] == 0xfe && buffer[1] == 0xff)
    		encoding = Encoding.BigEndianUnicode; // utf-16be
    	else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
    		encoding = Encoding.UTF32;
    	else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
    		encoding = Encoding.UTF7;

    	using (MemoryStream stream = new MemoryStream())
    	{
    		stream.Write(buffer, 0, buffer.Length);
    		stream.Seek(0, SeekOrigin.Begin);
    		using (StreamReader reader = new StreamReader(stream, encoding))
    		{
    			return reader.ReadToEnd();
    		}
    	}
    }
}
Last updated on 08 August 2009

Comments

blog comments powered by Disqus