Sorry about restating the obvious... but...everybody dislikes binary file header "bom's" like utf=8, utf-16 etc..too little...too late... instead, why not force everybody to build those file types into the shebang instead?
The problem with the shebang is that its not a file type its an executable...what is needed is the option to only specify a file type... examples: //Example Shebang: #!/usr/bin/perl //Example Shebam: #:utf8 //Example Shebam: #:ascii //Example Shebam: #:b64encrypt //Example Shebam: #:gtk+xml-gladed6 //Example Shebam: #:xml-myprogram //Example Shebamshebang: #:perl-ascii!/usr/bin/perl //Example Shebamshebang: #:perl-ascii!c:/perl/bin/perl.exe //Example Shebamshebang: #:perl-ascii!c:/perl/bin/perl.exe //utf16, utf32?? who cares... utf8 already won... 99% of the time... except for legacy windows code... inline void ShebamWrite(ofstream& myfile, const string Shebam) { myfile <<"#:" << Shebam << "\n"; } //Shebam: A File 'Bom' the way it should have been done. inline string ShebamCheck(string filename) { ifstream myfile(filename); string Shebam = ShebamRead(myfile); myfile.close(); return Shebam; } inline string ShebamRead(ifstream& myfile) { string buffer; getline(myfile, buffer); int len = buffer.size(); if (len < 2) return string{}; bool found=false; if ((buffer[0]=='#') && ((buffer[1]==':') || (buffer[1]=='!'))) { for(int i=2; i < len; i++) { if (!isprint(buffer[i])) { found=false; break; } else if (i>3) { //need at least one bom character found=true; } } } if (!found) { return string{}; } buffer.erase(0, 2); return buffer; } int main(int argc, char** argv) { string shabam1 = ShebamCheck("myfile1.txt"); if (shabam1 == string{}) { cout << "shebam1 = none\n"; } else { cout << "shebam1 = " << shebam1 << "\n"; } return 0; }