9

クリップボードからHTMLを取得すると、エンコードが正しくなくなり、奇妙な文字が挿入されることに気付いた人はいますか?

たとえば、次のようなコマンドを実行します。

string s = (string) Clipboard.GetData(DataFormats.Html)

結果は次のようになります。

<FONT size=-2>  <A href="/advanced_search?hl=en">Advanced 
Search</A><BR>  <A href="/preferences?hl=en">Preferences</A><BR>  <A 
href="/language_tools?hl=en">Language 
Tools</A></FONT>

MarkDownがこれをどのように処理するかはわかりませんが、上記の結果のマークアップには奇妙な文字が含まれています。

バグは.NETFrameworkにあるようです。クリップボードから正しくエンコードされたHTMLを取得するための最良の方法は何だと思いますか?

4

5 に答える 5

3

この場合、私の場合ほど目に見えません。今日、クリップボードからデータをコピーしようとしましたが、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 でした) (現在、すべてのコードがデータの解析に失敗しています。修正が既に適用されているアプリケーションと修正されていないアプリケーションの正しい動作を判断するには、別の問題があります。)

于 2013-09-28T15:07:51.950 に答える
1

DataFormats.Html 仕様には、UTF-8 でエンコードされていると記載されています。しかし、.NET 4 Framework 以前にはバグがあり、実際にはWindows-1252として UTF-8 として読み取られます。

'Å'、'‹'、'Å''、'Ž'、'Å¡'、'Å"'、'ž'、'Ÿ ','Â','¡','¢','£','¤','Â¥','¦','§','¨','©'

詳細な説明はこちら Debugging Chart Windows-1252 Characters to UTF-8 Bytes to Latin-1 Characters

Soln: 翻訳辞書を作成し、検索して置換します。

于 2016-06-28T05:47:15.493 に答える
1

データを UTF-8 として解釈する必要があります。MS Office のハイパーリンクがコード ページを変更するのを参照してください。.

于 2008-10-27T05:41:57.263 に答える
0

これを試して:

System.Windows.Forms.Clipboard.GetText(System.Windows.Forms.TextDataFormat.Html);
于 2015-04-15T22:58:22.807 に答える
0

元のソース ドキュメントが何であるかはわかりませんが、Word と Outlook では、異なるエンコーディングで複数のバージョンのクリップボードが提供されていることに注意してください。1 つは通常 Windows-1252 で、もう 1 つは UTF-8 です。Windows-1252 (Latin-1 + Smart Quotes) を期待しているときに、デフォルトで UTF-8 エンコード バージョンを取得している可能性がありますか? 非 ASCII 文字は複数の奇数の Latin-1 アクセント付き文字として表示されます。ほとんどの「スマート クォート」は、Latin-1 セットにはなく、多くの場合、UTF-8 で 3 バイトです。

クリップボードの内容をどのエンコーディングにするかを指定できますか?

于 2013-07-08T17:15:54.753 に答える