РЕДАКТИРОВАТЬ: Я только что попытался воспроизвести это, и я не могу в настоящее время заставить ASCIIEncoding вместо того, чтобы иметь другую замену.Вместо этого я должен был бы использовать Encoding.GetEncoding, чтобы получить изменяемый.Так что для ASCIIEncoding я согласен ... но для других реализаций, где IsSingleByte
возвращает true, у вас все еще может быть потенциальная проблема ниже.
Подумайте о попытке получить количество байтов строки, которая не просто содержит символы ASCII.Кодирование должно учитывать EncoderFallback
, что может делать любое количество вещей, в том числе увеличивать счет на неопределенную величину.
Это может быть оптимизировано для случаягде резервный кодер является "значением по умолчанию", которое просто заменяет не-ASCII символы на "?"хотя.
Дальнейшее редактирование: я только что попытался перепутать это с суррогатной парой, надеясь, что она будет представлена одним знаком вопроса.К сожалению, нет:
string text = "x\ud800\udc00y";
Console.WriteLine(text.Length); // Prints 4
Console.WriteLine(Encoding.ASCII.GetByteCount(text)); // Still prints 4!