「ä」は有効なUTF-8ではありません...これは正しくありません...
UTF-8が何であるかを明確に理解していないようです。UTF-8は、Unicodeコードポイントをエンコードする方法のシステムです。有効性の問題は文字自体ではなく、どのようにエンコードされているかという問題です... Unicodeコードポイント
をエンコードできるシステムはたくさんあります。UTF-8は1つで、UTF16はもう1つです... UTF-8システムでは非常に合法です。実際には、その文字がUnicodeコードポイントを持っている限り、すべての文字が有効です。
"ä"
ただし、ASCIIには128の有効な値しかありません。これは、Unicodeコードポイントシステムの最初の128文字と同じです。Unicode自体は、単なる大きなルックアップテーブルにすぎません。仕事はエンコーディングシステムです。例えば。UTF-8。
128個のASCII文字は最初の128個のUnicode文字と同一であり、UTF-8はこれらの128個の値をASCIIと同様に1バイトで表すことができるため、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"