File.ReadAllText с UTF-7 игнорированием + символов

У меня есть файл на диске, который был записан программой, с некоторыми данными, закодированными в Json.

Я использую C# File.ReadAllText(путь строки, кодировка), чтобы прочитать его позже. По несвязанным причинам нам приходится работать с UTF-7.

Наши строки выглядят так:

var content = File.ReadAllText(fileName, Encoding.UTF7);

Работает нормально, пишет, читает, в основном все, что нам нужно. Единственным исключением является знак плюс (+). Если в нашем файле есть знак +, этот код возвращает всю строку, игнорируя все из них. Так

{ "commandValue": "testvalue + otherValue" }

превращается в

{ "commandValue": "testvalue  otherValue" }

Я проверил байты файла, и знак + действительно является char 0x2B, который является правильным символом в UTF-7 (а также тем же самым символом в UTF-8, не уверен, имеет ли это значение).

Я не могу понять, почему они исчезают при чтении.

Ради тестов, я попытался прочитать это с

var content = File.ReadAllText(fileName, Encoding.UTF8);

и это работало нормально. Символы не исчезли.

Что я мог делать неправильно, и как я могу заставить File.ReadAllText(fileName, Encoding.UTF7) не игнорировать эти символы?

На данный момент я не нашел другого персонажа с такой проблемой, но, очевидно, не проверял все из них.

1 ответ

Решение

Файл не пишется с использованием UTF7. "+" - это специальный символ в схеме кодирования UTF7, используемый для обозначения начала последовательности "модифицированной base64". Таким образом, когда файл читается как UTF7, декодер видит "+", ожидает измененную последовательность base64 (но не находит ни одной), а затем продолжает декодировать файл как обычно. "+" В результате подавляется с выхода.

Чтобы устранить возникшую проблему, вы можете попробовать прочитать файл как UTF8 или обновить код, записывающий файл, чтобы убедиться, что он использует кодировку UTF7.

Другие вопросы по тегам