Вообще неправильный подход затачивать софт под compatibility layer, а не наоборот. Но, как видится, костылей в этом топике не признают, поэтому мы сейчас нахватаемся минусов :)
Для 1251 примерно такой изврат выходит, дальше думать лениво :)
public static string GetString(byte[] bytes, int offset, int length)
{
if (bytes == null)
throw new ArgumentNullException("bytes");
if (offset < 0 || offset >= bytes.Length)
throw new ArgumentException("offset");
if (length < 0 || offset + length > bytes.Length)
throw new ArgumentException("length");
var sb = new char[length];
length += offset;
for (var i = offset; i < length; i++)
{
byte b = bytes[i];
if (b < 128)
{
sb[i] = (char)b;
}
else if (b >= 192)
{
sb[i] = (char)(848 + b);
}
else
{
switch (b)
{
case 128: sb[i] = '\u0402'; break;
case 129: sb[i] = '\u0403'; break;
case 130: sb[i] = '\u201A'; break;
case 131: sb[i] = '\u0453'; break;
case 132: sb[i] = '\u201E'; break;
case 133: sb[i] = '\u2026'; break;
case 134: sb[i] = '\u2020'; break;
case 135: sb[i] = '\u2021'; break;
case 136: sb[i] = '\u20AC'; break;
case 137: sb[i] = '\u2030'; break;
case 138: sb[i] = '\u0409'; break;
case 139: sb[i] = '\u2039'; break;
case 140: sb[i] = '\u040A'; break;
case 141: sb[i] = '\u040C'; break;
case 142: sb[i] = '\u040B'; break;
case 143: sb[i] = '\u040F'; break;
case 144: sb[i] = '\u0452'; break;
case 145: sb[i] = '\u2018'; break;
case 146: sb[i] = '\u2019'; break;
case 147: sb[i] = '\u201C'; break;
case 148: sb[i] = '\u201D'; break;
case 149: sb[i] = '\u2022'; break;
case 150: sb[i] = '\u2013'; break;
case 151: sb[i] = '\u2014'; break;
case 152: sb[i] = '\u0098'; break;
case 153: sb[i] = '\u2122'; break;
case 154: sb[i] = '\u0459'; break;
case 155: sb[i] = '\u203A'; break;
case 156: sb[i] = '\u045A'; break;
case 157: sb[i] = '\u045C'; break;
case 158: sb[i] = '\u045B'; break;
case 159: sb[i] = '\u045F'; break;
case 160: sb[i] = '\u00A0'; break;
case 161: sb[i] = '\u040E'; break;
case 162: sb[i] = '\u045E'; break;
case 163: sb[i] = '\u0408'; break;
case 164: sb[i] = '\u00A4'; break;
case 165: sb[i] = '\u0490'; break;
case 166: sb[i] = '\u00A6'; break;
case 167: sb[i] = '\u00A7'; break;
case 168: sb[i] = '\u0401'; break;
case 169: sb[i] = '\u00A9'; break;
case 170: sb[i] = '\u0404'; break;
case 171: sb[i] = '\u00AB'; break;
case 172: sb[i] = '\u00AC'; break;
case 173: sb[i] = '\u00AD'; break;
case 174: sb[i] = '\u00AE'; break;
case 175: sb[i] = '\u0407'; break;
case 176: sb[i] = '\u00B0'; break;
case 177: sb[i] = '\u00B1'; break;
case 178: sb[i] = '\u0406'; break;
case 179: sb[i] = '\u0456'; break;
case 180: sb[i] = '\u0491'; break;
case 181: sb[i] = '\u00B5'; break;
case 182: sb[i] = '\u00B6'; break;
case 183: sb[i] = '\u00B7'; break;
case 184: sb[i] = '\u0451'; break;
case 185: sb[i] = '\u2116'; break;
case 186: sb[i] = '\u0454'; break;
case 187: sb[i] = '\u00BB'; break;
case 188: sb[i] = '\u0458'; break;
case 189: sb[i] = '\u0405'; break;
case 190: sb[i] = '\u0455'; break;
case 191: sb[i] = '\u0457'; break;
}
}
}
Для latin1 вроде можно же просто sb[i] = (char) bytes[i+offset] написать.
Для cp1251 символы до 128 тоже прямое соответствие имеют, для остальных нужно прописывать коды символов.
Ок, на слот update() таблицы приходит сигнал. Это означает, что таблица поменялась. Соответственно, ей нужно со всех связанных визуальных элементов собрать данные. Даже если она знает, от какого визуального элемента пришел сигнал, то все равно нужно реализовывать логику переноса значения из этого элемента в соответствующее поле той записи, которая в настоящий момент ассоциирована с текстовым полем.
Пример посмотрел. Из чего-то, напоминающего биндинг, там только
, остальное же — обычный код обработки событий, причем, как я понимаю, соответствие там одностороннее, в обратную сторону такая штука работать не будет.
Ок, а как выглядит слот update() у таблицы? Мы сами его пишем, или стандартный?
Если стандартный, то он учитывает, что значение поля может отображаться в нескольких визуальных полях и что нужно обновить остальные, кроме пославшего changed?
И раз это слот таблицы, то он что, опрашивает изменения для всех записей? Не приведет ли это к потере производительности?
И как в этом сценарии добавляется, например, валидация ввода? Или преобразование форматов/типов?
Советую взглянуть на список известных SID-ов тут: support.microsoft.com/kb/243330
Не вижу помех забить эту константу в батник при записи пути в реестр.
Когда в свое время интересовался вопросом, то IE был единственным 64-битным браузером. Сейчас есть другие?
А в Silverlight unsafe-инструкции запрещены, насколько я помню.
Для cp1251 символы до 128 тоже прямое соответствие имеют, для остальных нужно прописывать коды символов.
Пример посмотрел. Из чего-то, напоминающего биндинг, там только , остальное же — обычный код обработки событий, причем, как я понимаю, соответствие там одностороннее, в обратную сторону такая штука работать не будет.
Если стандартный, то он учитывает, что значение поля может отображаться в нескольких визуальных полях и что нужно обновить остальные, кроме пославшего changed?
И раз это слот таблицы, то он что, опрашивает изменения для всех записей? Не приведет ли это к потере производительности?
И как в этом сценарии добавляется, например, валидация ввода? Или преобразование форматов/типов?
Не холивара ради, мне просто любопытно :)