Класс Encoding
не может иметь дело с этим напрямую, но Decoder
, возвращенный из Encoding.GetDecoder()
, может (действительно, это вся его причина существования). StreamReader
использует Decoder
внутри.
Работать с ним немного неудобно, поскольку необходимо заполнить char[]
, а не возвращать string
(Encoding.GetString()
и StreamReader
обычно обрабатывают бизнес заполнения char[]
). [1116 ]
Проблема с использованием MemoryStream
заключается в том, что вы копируете все байты из одного массива в другой, без усиления. Если все ваши буферы имеют одинаковую длину, вы можете сделать это:
var decoder = Encoding.UTF8.GetDecoder();
// +1 in case it includes a work-in-progress char from the previous buffer
char[] chars = decoder.GetMaxCharCount(bufferSize) + 1;
foreach (var byteSegment in bytes)
{
int numChars = decoder.GetChars(byteSegment, 0, byteSegment.Length, chars, 0);
Debug.WriteLine(new string(chars, 0, numChars));
}
Если буферы имеют разную длину:
var decoder = Encoding.UTF8.GetDecoder();
char[] chars = Array.Empty();
foreach (var byteSegment in bytes)
{
// +1 in case it includes a work-in-progress char from the previous buffer
int charsMinSize = decoder.GetMaxCharCount(bufferSize) + 1;
if (chars.Length < charsMinSize)
chars = new char[charsMinSize];
int numChars = decoder.GetChars(byteSegment, 0, byteSegment.Length, chars, 0);
Debug.WriteLine(new string(chars, 0, numChars));
}
Это работало на меня †“В и в режиме причуд и в режиме соответствия стандартов. Однако это делает не работа при переключении на режим эмуляции IE8.
Одна вещь отметить:
Это действительно работает, , НО при загрузке локальной сети страницы/сайта (например, Интранет) , она загрузится в [1 116] режим IE7 по умолчанию! (обновление - localhost [*] является особым случаем, это делает рендеринг в режиме стандартов)
, Это идет вразрез с исходным положением MSFT идущих СТАНДАРТОВ по умолчанию.
, например,
http://127.0.0.1/mysite/mypage.php <-- IE8 by default (updated!)
http://localhost/mysite/mypage.php <-- IE8 by default (updated!)
http://machinename/mysite/mypage.php <-- IE7 by default
http://192.168.100.x/mysite/mypage.php <-- IE7 by default
http://google.com/ <-- IE8 by default
[*] - Scott Dickens [MSFT] отметил в комментарии здесь о Блоге IE, что localhost был специальным сценарием в Интранет (часто раньше разрабатывал сайты), таким образом представит в режиме Standards по умолчанию.
Для тестирования, в чем действительно представляет режим страница в IE8 можно использовать, проверяют инструменты разработчика или используют этот bookmarklet код (только работы в IE8):
javascript:
var vMode=document.documentMode;
var rMode='IE5 Quirks Mode';
if(vMode==8){
rMode='IE8 Standards Mode';
} else if(vMode==7){
rMode='IE7 Strict Mode';
}
alert('Rendering in: '+rMode);
Настройки представления Tools/Compatability
сняли флажок с ними весь
Спасибо за вашу помощь. Я нашел решение, по-видимому, проблема заключалась в том, что каждая таблица стилей использовала свой собственный атрибут заголовка. Как только я убрал заголовки со всех, кроме основной таблицы стилей, без проблем.
Это странная проблема, уникальная для IE8 - и хотя мне сказали, что она должна работать таким образом, что-то связано с «Предпочтением таблицы стилей» - он служит только для создания проблем, поскольку решение требует, чтобы вы удалили заголовок, который может быть полезен при написании сценариев и т. д. - когда вам нужно вызвать таблицу стилей.
В любом случае, не уверен, ошибка ли это или ее должно быть так, но я надеюсь, что Microsoft продолжит расследование.
Спасибо
Зачем вообще писать отдельную таблицу стилей для IE8?
Если вы уже отлаживали IE7, вы можете принудительно настроить IE8 в режим совместимости и, таким образом, отображать ваш код, как если бы IE8 был IE7.
Все, что вам нужно сделать, это поместить это ВПРАВО НИЖЕ открывающего тэга. В другом месте, и это не сработает.
И тогда это на полчаса или около того меньше работы на проект, не требуется интенсивная отладка для IE8!
Даже Msn.com делает это - какая-то ирония, а?
Недавно написал об этом сообщение в блоге: http://blog.sankhomallik.com/2009/11/16/stop-wasting-time-debugging-on-ie8-when-you-dont-have- to-or-get-ie8-to-behavior-like-ie7 /
IE8 выглядит довольно хорошо по сравнению с IE7, у меня есть таблицы стилей для IE6, IE7 и IE8; сначала я подумал, что условные комментарии не работают для IE8, после небольшого эксперимента я обнаружил, что некоторые правила не применяются IE8 только потому, что мне нужно было сначала поставить предок или родительский класс, например у меня был класс вроде
.niceclass {some: properties; more: properties;}
он работал только , если я изменил его на что-то вроде:
.parentclass .niceclass {some: properties; more: properties;}
или
#parentselector .niceclass {some: properties; more: properties;}
кстати, в моем CSS только для IE8 у меня есть только одно правило переопределения, остальное почти отображается как firefox, хотя это не заставляет меня уходить из FF!
Со своей стороны я хотел использовать закругленные границы с помощью css. IE8 на Vista такого не поддерживает. А так как графика была такова, что на закругленных границах тоже была красивая закругленная тень, страница в IE8 выглядела ужасно.
Я пытался использовать условные комментарии, но безрезультатно, IE8 не оценивал бы выражение в IE и, таким образом, не включал бы внешнюю таблицу стилей.
Затем я посмотрел, как поместить его в режим причудливости/компатиблиотечности, однако, это все равно не сработало, так как CSS-взломщики, которые я использовал, больше не работали для IE8.
Последнее, но по крайней мере, я нашел работающий CSS-взлом, который корректно отрисовывает страницу, когда она находится в режиме совместимости.
* + html #test[id] { color:lime }
Сейчас я не знаю, работает ли это для IE7 или ниже, так что у вас было бы, по крайней мере, три различные взломы для каждого релиза IE, которые вы хотите поддерживать, например
* + html #test,
html+body #test,
* html body #test
{ color:lime }
Интересно, какая следующая регрессия Internet Exploiter увидит нас.
.