Skip to content

Instantly share code, notes, and snippets.

@NDiiong
Created January 21, 2021 12:54
Show Gist options
  • Save NDiiong/7f1cde68a8bcdf9f28d793e49c68908f to your computer and use it in GitHub Desktop.
Save NDiiong/7f1cde68a8bcdf9f28d793e49c68908f to your computer and use it in GitHub Desktop.
Detect Encoding ANSI
public static bool ANSI(string filename)
{
var file_stream = File.OpenRead(filename);
if (file_stream == null) return false;
var stream = new BinaryReader(file_stream);
var file_size = file_stream.Length;
byte[] buffer = new byte[file_size];
stream.Read(buffer, 0, (int)file_size);
stream.Close();
if ((file_size >= 3 && buffer[0] == 239 && buffer[1] == 187 && buffer[2] == 191) || (file_size >= 2 && buffer[0] == 254 && buffer[1] == byte.MaxValue) || (file_size >= 2 && buffer[0] == byte.MaxValue && buffer[1] == 254) || (file_size >= 4 && buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 254 && buffer[3] == byte.MaxValue) || (file_size >= 4 && buffer[0] == byte.MaxValue && buffer[1] == 254 && buffer[2] == 0 && buffer[3] == 0))
{
return false;
}
for (int i = 0; i < file_size; i++)
{
byte b = buffer[i];
if ((b & 0x80) == 0)
{
continue;
}
int length;
if ((b & 0xE0) == 192)
{
length = 2;
}
else if ((b & 0xF0) == 224)
{
length = 3;
}
else
{
if ((b & 0xF8) != 240)
{
return true;
}
length = 4;
}
if (i + length > file_size)
{
return true;
}
for (int a = 1; a < length; a++)
{
i++;
if ((buffer[i] & 0xC0) != 128)
{
return true;
}
}
}
return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment