この場合、私の場合ほど目に見えません。今日、クリップボードからデータをコピーしようとしましたが、Unicode 文字がいくつかありました。私が取得したデータは、Windows-1250 エンコーディング(私の Windows ではローカル エンコーディング) でUTF-8 でエンコードされたファイルを読み取るかのようでした。
あなたの場合も同じようです。Windows-1252 (または Windows-1250; どちらも動作します) でhtml データを保存する場合(標準のスペースではなく、Â 文字の後に改行不可スペース = 0xa0 を入れることを忘れないでください) 。次に、このファイルを UTF-8 ファイルとして開くと、何があるべきかがわかります。
私の他のプロジェクトでは、エンコーディングが破損しているデータを修正する関数を作成しました。
この場合、単純な変換で十分です。
byte[] data = Encoding.Default.GetBytes(text);
text = Encoding.UTF8.GetString(data);
私の元の関数はもう少し複雑で、データが破損していないことを確認するためのテストが含まれています...
public static bool FixMisencodedUTF8(ref string text, Encoding encoding)
{
if (string.IsNullOrEmpty(text))
return false;
byte[] data = encoding.GetBytes(text);
// there should not be any character outside source encoding
string newStr = encoding.GetString(data);
if (!string.Equals(text, newStr)) // if there is any character "outside"
return false; // leave, the input is in a different encoding
if (IsValidUtf8(data) == 0) // test data to be valid UTF-8 byte sequence
return false; // if not, can not convert to UTF-8
text = Encoding.UTF8.GetString(data);
return true;
}
これが最善(または正しい解決策)ではないことはわかっていますが、入力を修正する他の方法は見つかりませんでした...
編集:(2017年7月20日)
Microsoft は既にこのエラーを発見したようで、現在は正しく動作しています。問題が一部のフレームワークにあるかどうかはわかりませんが、答えを書いたときと同じように、アプリケーションが別のフレームワークを使用していることは確かです。(現在は 4.5 です。以前のバージョンは 2.0 でした)
(現在、すべてのコードがデータの解析に失敗しています。修正が既に適用されているアプリケーションと修正されていないアプリケーションの正しい動作を判断するには、別の問題があります。)