【问题标题】:How convert xml string UTF8 to UTF16?如何将 xml 字符串 UTF8 转换为 UTF16?
【发布时间】:2014-02-24 09:41:03
【问题描述】:

我有一个 XML 字符串(utf-8)。我需要将字符串存储在数据库中(MS SQL)。编码字符串必须是 UTF-16。

这段代码不行,utf16Xml是空的

XDocument xDoc = XDocument.Parse(utf8Xml);
xDoc.Declaration.Encoding = "utf-16";
StringWriter writer = new StringWriter();
XmlWriter xml = XmlWriter.Create(writer, new XmlWriterSettings() 
            { Encoding = writer.Encoding, Indent = true });

xDoc.WriteTo(xml);

string utf16Xml = writer.ToString();

utf8Xml - 字符串包含一个序列化对象(编码 UTF8)。

如何将xml字符串UTF8转为UTF16?

【问题讨论】:

  • 在上面的代码中,utf8Xml 变量的类型似乎是 string。但是,如果它不在 .NET string 编码中(如果您想知道,.NET 在内部使用 UTF-16),那将是一个病态的字符串。 utf8Xml 字符串从何而来?它是什么样子的?我认为问题在于我们看到的代码“之前”。
  • utf8Xml - 字符串包含一个序列化对象(编码 UTF8)。我与服务编码的 UTF8 交换数据
  • XDocument.Parse() 只接受strings,在实现中是UTF-16。要么你在创建string 时已经变成了UTF-16,否则Parse 将无法工作。
  • 在 .NET 中,System.String 是 UTF-16 代码单元的序列。通常,一个代码单元(一个System.Char 值)对应一个字符(但是平面0 外的每个字符需要两个代码单元,即所谓的代理对)。您的utf8Xml 变量似乎是System.String。然后根据定义,它不是 UTF-8。可能是字符串 utf8Xml 是从某些 UTF-8 源错误构造的。那么解决方案就是回头看看是怎么发生的,然后修复它。

标签: c# sql-server xml utf-8 utf-16


【解决方案1】:

鉴于XDocument.Parse 只接受string,并且.NET 中的string 始终是UTF-16 Little Endian,看起来您要经过很多步骤才能有效地什么都不做。要么:

  1. 字符串 - utf8Xml - 已经是 UTF-16 LE,可以按原样(即什么也不做)插入到 SQL Server 中,如 SqlDbType.Xml 或 SqlDbType.NVarChar,

    或

  2. utf8Xml 以某种方式包含 UTF-8 字节序列,这将是无效的 UTF-16 LE(即 Microsoft 领域中的“Unicode”)字节序列。如果是这种情况,那么您也许可以简单地:
    1. 添加 XML 声明,说明编码为 UTF-8:
      xDoc.Declaration.Encoding = "utf-8";
    2. 不要省略 XML 声明:
      OmitXmlDeclaration = false;
    3. 将utf8Xml 作为DbType.VarChar 传递到SQL Server

如需进一步解释,请参阅我对相关问题的回答(此处为 S.O.):

How to solve “unable to switch the encoding” error when inserting XML into SQL Server

【讨论】:

    【解决方案2】:

    这可能对你有帮助

    MemoryStream ms = new MemoryStream();
            XmlWriterSettings xws = new XmlWriterSettings();
            xws.OmitXmlDeclaration = true;
            xws.Indent = true;
            XDocument xDoc = XDocument.Parse(utf8Xml);
            xDoc.Declaration.Encoding = "utf-16";
            using (XmlWriter xw = XmlWriter.Create(ms, xws))
            {
    
                xDoc.WriteTo(xw);
            }
            Encoding ut8 = Encoding.UTF8;
            Encoding ut116 = Encoding.Unicode;
            byte[] utf16XmlArray = Encoding.Convert(ut8, ut116, ms.ToArray());
            var utf16Xml = Encoding.Unicode.GetString(utf16XmlArray);
    

    【讨论】:

    • 即使在您的代码中,如果您在字符串 utf16Xml = writer.ToString(); 之前处理 xml(xml.Dispose)它会工作
    猜你喜欢
    • 2012-11-04
    • 2016-09-04
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2012-02-01
    • 2012-02-13
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多