Как правило, вы не можете.
Наличие метки порядка байтов является очень убедительным признаком того, что файл, который вы читаете, является Unicode.Если вы ожидаете текстовый файл, и первые четыре байта, которые вы получаете:
0x00, 0x00, 0xfe, 0xff -- The file is almost certainly UTF-32BE
0xff, 0xfe, 0x00, 0x00 -- The file is almost certainly UTF-32LE
0xfe, 0xff, XX, XX -- The file is almost certainly UTF-16BE
0xff, 0xfe, XX, XX (but not 00, 00) -- The file is almost certainly UTF-16LE
0xef, 0xbb, 0xbf, XX -- The file is almost certainly UTF-8 With a BOM
Но что еще?Если байты, которые вы получаете, являются чем-то отличным от одного из этих пяти шаблонов, то вы не можете с уверенностью сказать, что ваш файл UTF-8 или нет.
Фактически, любой текстовый документ, содержащий только символы ASCIIот 0x00 до 0x7f является действительным документом UTF-8, а также простым документом ASCII.
Существуют эвристики, которые могут попытаться вывести, основываясь на видимых символах, кодируется ли документскажем, в ISO-8859-1, или UTF-8, или CP1252, но в целом первых двух, трех или четырех байтов файла недостаточно, чтобы определить, является ли то, что вы просматриваете, определенно UTF-8.