C# XmlWriter пропускает старший суррогатный символC#

Место общения программистов C#
Anonymous
C# XmlWriter пропускает старший суррогатный символ

Сообщение Anonymous »

Я использую класс XmlWriter для создания большого XML-файла. Все работает так, как ожидалось, за исключением одного конкретного файла, который мне нужно создать. У меня есть строка, содержащая 💥 () эмодзи.
Этот эмодзи правильно сериализован в большей части файла.

Код: Выделить всё

Example 💥
Однако внезапно я получаю такую ​​строку:

Код: Выделить всё

Example � (asdf)
Строка «Имя» не совпадает, но обе содержат одинаковые смайлы, а вторая строка также правильно сериализуется в других частях файла.
Я понимаю, что строки хранения .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 не помогло. Приложение работает внутри Docker-контейнера с mcr.microsoft.com/dotnet/aspnet:8.0 в качестве базового образа, поэтому, кроме ядра, среда должна быть везде одинаковой.
Чем можно объяснить такое поведение?

Подробнее здесь: https://stackoverflow.com/questions/791 ... -character

Вернуться в «C#»