C# XmlWriter 跳过高代理字符

问题描述 投票:0回答:1

我正在使用

XmlWriter
类来生成一个大的 xml 文件。除了我必须生成的一个特定文件之外,一切都按预期进行。我有这个包含 💥 (
\u1F4A5
) 表情符号的字符串。

此表情符号在大部分文件中都正确序列化。

<Name>Example &#x1F4A5;</Name>

然而,突然间,我得到这样一句话:

<Name>Example &#xDCA5; (asdf)</Name> 

Name
字符串不相同,但都包含相同的表情符号,并且第二个字符串在文件的其他部分也正确序列化。

我了解 .NET 使用 UTF-16 存储字符串。在此编码中,该表情符号对应于

0xD83D 0xDCA5
。在调试这个问题时,我检查了存储变量的内存区域,我可以看到所有字节都在那里。

所以这几乎就像

XmlWriter
正在跳过高代理字符。我无法在较小的测试中重现这个问题。仅当应用程序在 Kubernetes 集群内运行时,此大文件才会发生这种情况。如果我在本地运行相同的代码,我每次都会得到正确的序列化。

这是我的代码的简化版本:

var writer = XmlWriter.Create(stream, new XmlWriterSettings
{
    Encoding = Encoding.GetEncoding(
        "Windows-1252",
        new EncoderReplacementFallback(),
        new DecoderReplacementFallback()
    ),
    Indent = true,
});

//...

foreach(var item in items){
    //...
    writer.WriteElementString("Name", item.Name);
    //...
}

我最初运行的是 .NET 6,升级到 .NET 8 没有帮助。该应用程序在以

mcr.microsoft.com/dotnet/aspnet:8.0
作为基础镜像的 Docker 容器内运行,因此,除了内核之外,各处的环境应该是相同的。

什么可以解释这种行为?

c# .net utf-16 xmlwriter
1个回答
0
投票

使用 UTF-8 编码:考虑切换到 UTF-8 编码,它可以处理所有 Unicode 字符,包括表情符号。按如下方式修改您的 XmlWriterSettings:

var writer = XmlWriter.Create(stream, new XmlWriterSettings
{
    Encoding = Encoding.UTF8,
    Indent = true,
});

显式处理代理:如果必须坚持使用特定编码(如 Windows-1252),则可以在将代理对写入 XML 之前显式处理代理对。确保字符串没有任何未配对的代理。

清理输入:如果某些字符串有问题,您可能需要在写入之前对其进行清理或验证,以确保所有表情符号都正确编码。

检查高代理项:在调用 WriteElementString 之前,您可以检查 item.Name 字符串以查看它是否包含未配对的高代理项并进行相应处理。

© www.soinside.com 2019 - 2024. All rights reserved.