【问题标题】:C# UTF-8 Encoding ProblemC# UTF-8 编码问题
【发布时间】:2009-09-26 20:20:52
【问题描述】:

我在 Stack Overflow 上搜索过帖子,并阅读了 JoelOnSoftware 关于编码的帖子,现在对编码问题有了基本的了解。但是我遇到了来自 Windows 剪贴板的一些字符编码的问题。

可重现的测试是使用 IE 并从 Google 主页中选择并复制“Advertising Programs”文本。

我正在使用以下 C# 代码从剪贴板中提取此文本(已删除错误检查):

uint FormatId = GetRegisteredClipboardFormatId("HTML Format");
IntPtr hHtml = Win32.GetClipboardData(FormatId);
uint DataSize = Win32.GlobalSize(hHtml);
byte[] HtmlData = new byte[DataSize];
IntPtr pData = Win32.GlobalLock(hHtml);
Marshal.Copy(pData, HtmlData, 0, (int)DataSize);
Win32.GlobalUnlock(hHtml);

剪贴板的 HTML 数据应该是 UTF-8 编码的,所以我使用下面的方法将数据转换为字符串:

string Content = Encoding.UTF8.GetString(HtmlData);

但是,忽略周围的 HTML 标记,结果是:

“广告计划”

是我做错了什么,误解了什么,还是问题出在其他地方?

感谢您的帮助!

【问题讨论】:

    标签: c# encoding utf-8


    【解决方案1】:

    您将 UTF-8 显示为 Latin-1 或其变体 (CP1252)。

    Google 在该句子中使用了一个 nbsp,即 C2 A0,在 Latin-1 中恰好是“ ”。

    编辑:您在此处显示的代码没问题。我认为当您显示content 时会出现问题。看起来您输出的是 UTF-8,但显示媒体需要的是 Latin-1。

    如果你使用控制台显示,试试这个,

     Console.OutputEncoding = Encoding.GetEncoding("iso-8859-1");
    

    这将告诉控制台发送 Latin-1,而不是 UTF-8。

    如果您在浏览器中显示文本,请确保网页标有 UTF-8,例如,

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    

    【讨论】:

    • 好吧,我想这会导致另外两个问题: 1. 如果 Encoding 类知道它正在接受 UTF-8 并输出 Unicode(UTF-16?) 字符串,它不应该知道如何将 UTF-8 中的 C2 A0 转换为   的正确表示在 Unicode 中?我假设我在基本层面上误解了编码问题。继续做更多的研究... 2. 我最终将字符串编码回 UTF-8 以在浏览器中呈现。我只是为了方便解析而转换为 .NET 字符串。有没有更好的方法来解析原生 UTF-8 编码的文本?
    • 太棒了!成功了 - 非常感谢您的指点!
    【解决方案2】:

    检查 HTML 代码。有“&amp;nbsp;” 在“广告”和“节目”之间。

    用“商业解决方案”文本试试你的代码,它会起作用。

    您很可能需要将 nbsp 替换为普通空格。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2017-12-22
      相关资源
      最近更新 更多