Вероятность того, что в последовательности нет недопустимых символов UTF-8, может рассматриваться как UTF-8. Так как RegExps предназначены для текста в .Net, а не для байтовых массивов, вот решение, не являющееся регулярным выражением, которое должно работать. Лично я предпочел бы использовать это в качестве резервного механизма (например, mycommand -autodetect) и предлагать параметры конвейера, которые позволяют заданные пользователем кодировки.
string result=String.Empty;
Encoding ae = Encoding.GetEncoding(
Encoding.UTF8.EncodingName,
new EncoderExceptionFallback(),
new DecoderExceptionFallback());
try {
result=ae.GetString(mybytes);
}
catch (DecoderFallbackException e)
{
//revert to some sensible default. Maybe the Ansi Code page for this environment?
// This will use the substitution fallback mechanism, which usually replaces unknown characters with question marks.
result=Encoding.Default.GetString(mybytes);
}
Если вы можете взаимодействовать с неуправляемым кодом, изучите MLANG dll, поставляемый с IE. Он имеет альтернативные методы автоопределения кодирования, которые могут быть более полезными.