【问题标题】:Xdocument - how to convert non-html safe charactersXdocument - 如何转换非 html 安全字符
【发布时间】:2010-11-25 22:47:47
【问题描述】:

我的 UTF-8 xml 元素中有一个“title”属性,例如

<tag title="This is some test with special chars §£" />

由于我希望将此属性的内容直接打印在 HTML 页面中,因此我尝试输出如下:

<tag title="This is some test with special chars &#x00a7;&#x00a3;" />

我在其中添加属性的代码片段如下所示:

new XElement( "tag",
    new XAttribute( "title" , title)
);

& 和 " 等字符被转义,但 §£ 不是 - 因为它们是有效的 utf-8 字符。 我应该改变什么?

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    如果页面声明为 UTF-8,则 HTML 支持 UTF-8 字符。

    您应该始终指定编码 用于 HTML 或 XML 页面。如果你 不要,你冒着这些角色的风险 您的内容不正确 解释。这不仅仅是一个问题 人类可读性,越来越 机器需要理解你的数据 也。您还应该检查您是否 没有指定不同的编码 在不同的地方。

    如果页面的默认编码是一个较小范围的字符集,则它不会正确呈现所有 UTF-8 字符。但是,如果文档被声明为 UTF-8,它们应该可以正常显示。

    而不是用实体引用替换字符,you may need to explicitly declare the encoding of your page as UTF-8.

    有多种方法可以做到这一点:

    • &lt;meta charset="UTF-8"&gt;
    • &lt;meta http-equiv="Content-type" content="text/html;charset=UTF-8"&gt;
    • &lt;?xml version="1.0" encoding="UTF-8"?&gt;

    【讨论】:

    • 有什么缺点吗?我正在考虑 IE/移动设备的兼容性。另外,你会推荐哪种方式?我会选择任何一个元标记,而不是最后一个,因为我认为它需要 XHTML
    • 首选方法取决于您正在创建的内容(即 HTML 4、HTML 5、XHTML)。 HTML4 - 在 head 元素的顶部使用 pragma 指令。 &lt;meta http-equiv="Content-type" content="text/html;charset=UTF-8"&gt;。我不知道同时使用两个元标记是否会“伤害”你的基地。
    • 这听起来很有趣,但是从快速测试看来,至少 ffox 完全忽略了元标记并直接使用 content-type 标头编码。我想我需要改变它,没有办法绕过标题?
    【解决方案2】:

    也许您可以手动解码这些字符。我以前用过这个

     Dictionary<string, char> HTMLSymbolMap = new Dictionary<string, char>()
            {
                {"&#8211;",'–'},
                {"&#8212;",'—'},
                {"&#8216;",'‘'},
                {"&#8217;",'’'},
                {"&#8218;",'‚'},
                {"&#8220;",'“'},
                {"&#8221;",'”'},
                {"&#8226;",'•'},
                {"&#183;",'·'},
                {"&#8222;",'„'},                
                {"&#163;",'£'},
                {"&#167;",'§'},
    
            };
    
       public string CleanJunk(string docText)
        {
    
    
            foreach (var kv in HTMLSymbolMap)
            {
                docText = docText.Replace(kv.value.tostring(), kv.key);
            }
    
            return docText;
    
        }
    

    更多信息请参考HTMLSymbol table

    【讨论】:

      猜你喜欢
      • 2013-09-03
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多