Вы говорите, "ä" недействительно UTF-8 ... Это не правильно ...
Кажется, у вас нет четкого понимания того, что такое UTF-8,UTF-8 - это система как для кодирования кодовые точки Unicode .Вопрос достоверности не в самом символе, а в том, как он был закодирован ...
Существует множество систем, которые могут кодировать Unicode Codepoints ;UTF-8 - это одно, а UTF16 - это другое ... "ä"
вполне допустимо в системе UTF-8. Фактически все символы действительны, если этот символ имеет кодовую точку Unicode.
Однако ASCII имеет только 128 допустимых значений, которые идентичны первым 128 символам в системе кодовых точек Unicode.Unicode сам по себе не более, чем большой справочный стол.Что делает эта система кодирования;например.UTF-8.
Поскольку 128 символов ASCII идентичны первым 128 символам Unicode, а UTF-8 может представлять эти 128 значений одним байтом, как это делает ASCII, это означает, что данные в файле ASCII идентичен файлу с той же датой, но который вы называете файлом UTF-8.Проще говоря: ASCII - это подмножество UTF-8 ... они неразличимы для данных в диапазоне ASCII (т. Е. 128 символов).
Вы можете проверить файл на соответствие 7-битному ASCII ..
# If nothing is output to stdout, the file is 7-bit ASCII compliant
# Output lines containing ERROR chars -- to stdout
perl -l -ne '/^[\x00-\x7F]*$/ or print' "$1"
Вот аналогичная проверка на соответствие UTF-8 ..
perl -l -ne '/
^( ([\x00-\x7F]) # 1-byte pattern
|([\xC2-\xDF][\x80-\xBF]) # 2-byte pattern
|((([\xE0][\xA0-\xBF])|([\xED][\x80-\x9F])|([\xE1-\xEC\xEE-\xEF][\x80-\xBF]))([\x80-\xBF])) # 3-byte pattern
|((([\xF0][\x90-\xBF])|([\xF1-\xF3][\x80-\xBF])|([\xF4][\x80-\x8F]))([\x80-\xBF]{2})) # 4-byte pattern
)*$ /x or print' "$1"