Спрашивают, есть ли что-то подобное в текстовом режиме. Есть, только предупреждаю, там такой говнокодище, что самому смотреть страшно. И некрасиво выглядит, в отличие от графической версии. Если переделаешь, сойдет за зачет, наверное.
Даже картинки не будет.
C# Пример Charmap (таблицы символов) для различных кодировок.

Очередное студенческое задание, да. Причем опять, то ли препод не совсем адекватный, то ли студент, то ли мы дебилы и не видим чего-то лежащего на поверхности. Потому что «совсем для всех» кодировок, поддерживаемых .NET оно не получается.
Для начала, пришлось задачу все-таки глобально поделить на 3 больших части:
— кодировки однобайтовые (Windows 1251, DOS 866 и т.д.)
— кодировка Unicode
— кодировки многобайтовые, но не Unicode (всякие там японские, китайские и прочие).
С ними проще всего. Достаточно перебрать все символы от 0 до 255, перекодировать их последовательно в UTF-16 стандартной функцией класса Encoding
и вывести на экран.
Encoding enc = Encoding.GetEncoding(CP); for (int i = 0; i < 256; i++) { string sChr = enc.GetString(new byte[] { (byte)i }); //... }
Отделить их от остальных тоже просто, у объекта Encoding
есть свойство IsSingleByte
С этим тоже особой сложности нет, весь стандарт открытый, можно взять список диапазонов Юникода прямо с официального сайта. Разобрать, залить в ComboBox
и отображать кусками, для больших кусков сделать постраничное листание.
Главная проблема была побороть глюк с отображением символа с кодом > FFFFh Копия, из-за чего пришлось использовать RichTextBox
и периодически пересчитывать ему размер в зависимости от используемого шрифта и символа, а также в нужных местах перерисовывать таблицу, чтоб та не расползалась.

Вторая проблема - изобрести какое-то подобие "композитных" шрифтов в BabelMap, т.е. подгружать разные шрифты для разных диапазонов Unicode, поскольку шрифта, абсолютно поддерживающего все символы Unicode нет, он бы получился чудовищно большим. И те, которые есть-то, не маленькие, из нескольких файлов, и весят под сотню мегабайт.
Чтоб ради задания не загадить систему шрифтами, пришлось предусмотреть возможность грузить их из файлов, а тут поджидал уже другой глюк, на этот раз Framework'а Копия.
В общем, процентов 90 кода (да и процессорного времени) уходит на возню со шрифтами и отрисовку таблицы.
Отделить варианты кодирования Unicode от других кодовых страниц тоже несложно, благо всего этих вариантов не так много (UTF16 LE/BE, UTF32 LE/BE, UTF8 и UTF7).
public static bool IsUnicode(int CodePage) { if (CodePage == 65001 || CodePage == 65000 || CodePage == 1201 || CodePage == 1200 || CodePage == 12000 || CodePage == 12001) return true; else return false; }
А получить конкретный символ можно вот таким способом:
if ((num >= 0x00d800) && (num <= 0x00dfff)) { st = Convert.ToString((char)num); } else { st = char.ConvertFromUtf32(num); }
if ((num >= 0x00d800) && (num <= 0x00dfff))
- это чтобы не попасть в диапазоны суррогатов, но все-таки на их месте что-то отображать (в шрифтах там обычно пустые символы или знаки ?), а char.ConvertFromUtf32()
при попадании в диапазон суррогатов свалится с ошибкой.
А вот тут уже так легко не получится, все-таки единственный вменяемый способ, это искать спецификации на каждую. Поэтому, в рамках задания, эта часть задачи была признана некорректной и не решаемой.
Нет, был, конечно, вариант простого перебора всех возможных вариантов. Максимальное количество байт, необходимых для кодирования символа в указанной кодировке можно получить с помощью Encoding.GetEncoding(cp).GetMaxByteCount(1)
, но перебрать все возможные значения, например, для массива размером уже в 4 байта, перебирая его, например, так, да еще и фильтруя все лишнее, непомерно долго.
В общем, вроде бы того, что сделали, оказалось достаточно.
Пришлось студенту писать пояснительную записку с источниками 🙂
Исходник примера на GitHub
Скачать
Leha S, NKT
C# Ошибка «Попытка чтения или записи в защищенную память» при работе со шрифтами из PrivateFontCollection
Понадобилось грузить TTF-шрифты из файлов, что делается с помощью PrivateFontCollection.AddFontFile(FileName)
. И, внезапно, стал проявляться плавающий глюк, возникающий, если периодически пересоздавать объект PrivateFontCollection
. Например, при попытке сделать MeasureString(Text, LoadedFont).ToSize()
, программа стала вываливаться с ошибкой "Попытка чтения или записи в защищенную память"
.
Пишут, что это глюк Framework’а и толковое решение только одно, создавать PrivateFontCollection
один раз при запуске программы, например, в каком-нибудь статическом классе, и больше ее не трогать. Т.е. подгружать новые шрифты можно, а пересоздавать коллекцию не надо.
Минус решения — можно загадить память подгружаемыми шрифтами, если подгрузить много файлов. Но лучше пока ничего не нашел.
В принципе, можно создать вот такой статический класс, который будет подгружать шрифт в коллекцию, и хранить в Dictionary
сопоставление между именем файла и шрифтом в коллекции. Если файл еще не был загружен — подгружать, если был, возвращать позицию в коллекции.
Ну и чтоб два раза не вставать, класс FileFont, который заодно меняет параметры шрифта (размер и начертание).
На Cyberforum’е тоже пока ничего более дельного не предложили.
C# Отображение суррогатной пары (символа с кодом >FFFF)
Известно, что внутренний формат строк в .NET — UTF16, что значит, что символы из основной многоязыковой плоскости (BMP) Unicode, т.е. с кодом меньше FFFF кодируются одним машинным словом, а остальные символы — двумя, одно из которых т.н. суррогат.
Так вот, как оказалось, с отображением суррогатных пар может возникнуть проблема. Контролы Windows Forms могут воспринимать символ с кодом >FFFF не как один символ, как должно быть, а как два. Для примера пробуем отобразить анатолийский иероглиф

с кодом 0x14476

Как видно, TextBox
и Label
воспринимают символ, как два символа, и, соответственно, его не отображают, а RichTextBox
видит, что это один символ, но не отображает его, даже при правильно заданном шрифте.
MessageBox
также отображает символ не как один, а как два:

Для устранения проблемы с RichTextBox
достаточно задать нужный шрифт перед тем, как присвоить свойству Text
нужные символы.
int Code = 0x14476; //анатолийский иероглиф Font AnFont = new Font("Anatolian", 24, FontStyle.Regular, GraphicsUnit.Pixel, 1); private void Form1_Load(object sender, EventArgs e) { string strSP = char.ConvertFromUtf32(Code); lblTest.Font = AnFont; txtTest.Font = AnFont; lblFont.Text = AnFont.FontFamily.Name; rtbTest.Font = AnFont; lblTest.Text = strSP; txtTest.Text = strSP; rtbTest.Text = strSP; }

PictureBox
также отрисовывает нужный символ без проблем:

А корень проблемы кроется не в C#, .NET и компонентах Windows Forms, а в самой Windows. Пакет обновления SP1 для Windows 7 решает проблему полностью.
Наиболее универсальным решением является использование RichTextBox
для работы с такими символами, во всяком случае, это работает даже для Windows XP, для которой ждать патчей, понятное дело, не приходится.
Главное, не забывать про то, что шрифт надо задавать до вставки/присвоения символа.
Шрифты поддерживающие весь Unicode-диапазон
Или, во всяком случае, большинство символов.
TWBh: шрифт, поддерживающий большинство символов Unicode
Дополнительно:
Композитный шрифт для BabelMap (TWBhBabelCompositeFont.xml)
Композитный шрифт для WPF (TWBh.CompositeFont)
Композитный шрифт для примера простой Charmap для Unicode и однобайтных кодировок (babel.cf)
Universalia самый распространенный максимально поддерживающий Unicode набор шрифтов Ссылка Magnet
Набор шрифтов с почти полной поддержкой Unicode, собранный неизвестным пользователем интернета Что и как поддердживает каждый файл шрифта, есть описание в тектовом файле. Плюс есть композитный шрифт для тестовой программы.
Программа BabelMap Копия
Самый совершенный Charmap для Unicode, поддерживает композитные шрифты и все диапазоны Unicode
#FreeBakholdin
За кадром.
Или будни редакции.
Главред все переживал, не выглядит ли он на «свои почти 40 лет» и не сильно ли у него «насекомная (рептильная) мордочка», несмотря на все-таки серьезность акции и вполне ответственное, как наше всехное, так и его личное отношение. Не смог побороть глупую улыбку в камеру, как мы его просили.
«Ну не могу я, когда фоткают, не улыбаться, даже на загран 7 раз фотографировали», сказал редактор.
-А как ты, сишарпер хренов, по скайпу выступаешь.
-У меня камера хреновая, там хрен чо хрен разглядишь. И сишарп вообще не гадание на Таро, там лицо видеть не обязательно.
Ктулху с ним, как получилось, так и ладно.
БрокаЦентр
Нашли еще две темы. По-моему круто! Хотя мечтаю познакомить вас с их первым альбомом, на котором вполне себе панковский гражданско-оборонно-гаражный звук. Надеюсь, архивы Леши не оскудели, и в ближайшее время, таки да.
БрокаЦентр — СОН
БрокаЦентр — Терпи, ведь это любовь
Вторая песня, это заодно запоздалое поздравление с 8 марта всем парням, которым достались курицы или еще какие зверюшки, вместо женщин. Потому что их с 8 марта поздравлять и надо на самом деле. Такие тян, действительно, не нужны. Но многие парни, к сожалению, тетерева и фазаны, хотя думают, что львы.
Как-то так. Удачи!
BrokaCenter — INSIDE
Ну раз уж у нас сегодня вечер панковско-рокерских воспоминаний, навеянный приездом Леши, сегодняшним содержимым ленты, и вообще, каким-то анархическим настроением, то вот вам еще немного кондопожского панка.
Группа БрокаЦентр была в Кондопоге самой долгоиграющей, если исключить пипец какую древнюю группу «Всё» и Германа Фирсова, который вообще один из первых и старейших рок-музыкантов Карелии, России и СССР.
Больше БЦ на нас в нежном возрасте (включая половину ОИМ, и всю российскую часть редакции), наверное повлияли только LovinGod и группа Purgen.
Это одна из последних известных записей. Попробуем найти все и выложить в сеть. Даже введу новый тег.
Гаражный панк
Репетиция кондопожской группы «Позитив», 200█ год. Эх, как все было круто и мило, и отрываться можно было до утра, благо бешеный принтер еще не был настолько бешеным. Ну и Леше отдельное с кисточкой, хз в каких архивах откопавшему запись.
ГЕОРГИЕВСКАЯ ЧЛЕНТОЧКА
Уберите от экрана женщин, беременных детей и обязательно покажите ватникам!
Это меня так замечательно поздравили с 23 февраля. Такой вот дерьмоядреной бiмбой, способной порвать гигаватное количество пердаков!
Алсо, у нас была георгиевская туаленточка, она менее натуралистичная, но не менее разжигающая.
C# Перевод чисел между системами счисления стандартной функцией класса Convert
Да, совсем забыл выложить исходник, спасибо, что напомнили.
Перевести число в/из десятичной в 2, 8, и 16-ричную систему можно с помощью стандартной функции класса Convert
Convert.ToInt64(s, From)
s
— строка, содержащая число.
From
— основание системы счисления.
Обратное преобразование:
Convert.ToString(n, To)
n
— число
To
— основание системы счисления.
На выходе будет строка
В примере еще показал, как ограничить ввод в текстовое поле, чтоб можно было вводить только определенные символы, и добавил отображение символа по его коду (в однобайтной кодировке, для Unicode будет погода на Марсе). Числа можно вводить через пробел.

Иконка для своего приложения Windows. Стандартные размеры иконок
И как сделать ICO файл с несколькими изображениями
Спрашивали, как надо правильно делать иконку для своего Windows-приложения.
В первую очередь нужно ее нарисовать, либо найти изображение. Чем больше, тем лучше, поскольку для хорошей иконки потребуется несколько файлов разного размера.
Если изображение будет одно и маленькое, то иконка будет выглядеть некрасиво, пойдет квадратными пикселями.

То же самое касается и иконки для формы приложения, хотя на самой форме корректно будет отображаться и маленькая иконка 16×16 пикселей, при переключении по Alt+Tab уже будет заметно и некрасиво.


Рисовать, то лучше в каком-нибудь векторном редакторе, чтоб было потом проще создать несколько растровых изображений разных размеров. Мы, например, пользуемся Inkscape, он простой, бесплатный и для простых изображений вполне подойдет.
Еще момент — изображение должно, очевидно, быть квадратным.
Нарисовали, теперь нужно получить несколько изображений стандартных размеров:
— 16×16
— 32×32
— 48×48
— 256×256
Где-то читал рекомендацию, что нужен значок еще 128×128, но на практике пока не заметил, чтобы его наличие было критично.
Для Windows 7 и выше обязательно нужен значок 48×48
Обратите внимание, что размер значка рабочего стола по умолчанию в XP был 32×32, а в Windows 7 — 48×48
В значки для формы, а не для иконки экзешника, лучше не включать значок 256×256 в том случае, если приложение должно работать на XP.
В остальных случаях XP игнорирует значок 256×256, но ничего плохого при этом не происходит, а вот если такой значок используется для формы, то приложение может упасть.
Известно, что в одном файле ICO могут храниться несколько изображений разных размеров. Для сборки есть много приложений и онлайн-сервисов, но мы пользуемся простой бесплатной программкой icon sushi Копия
Пользоваться очень просто.
1. Открываем все нужные изображения
2. Выделяем их в окне программы:

3. Сохраняем иконку (File — Save as Multiple Icon)
ЗЫ. Чтоб два раза не вставать.
Кто-то просил картинки-кнопочки от XuliOrganizzer’а
Так Леша выложил картинки на Github
Текстовый редактор FOTON для DOS

Охрененная софтина была для 1989 года.
Макросы, возможность компиляции программ, не выходя из бассейна из редактора и множество передовых фишек для того времени.
А самое главное, в нем есть одна штука, которой до сей поры нет ни в одном более современном текстовом редакторе. Выделение прямоугольных блоков текста! Которые можно переносить, вставлять и т.д. Вот нет такого больше нигде и все, а надо иногда. Причем настолько надо, что периодически пользуюсь сим олдовым произведением программерского искусства. Хоть сам бери и пиши редактор с подобной функцией, блин.
UPD.
Есть, оказывается. Не знаю насчет vim и emacs, правда, но Notepad++ делает как надо. И Far (по Аlt+стрелки). А вот Студия делает, но не совсем так.


Его собственная внутренняя демка:
Colors. Утилита для подбора цвета фона и текста в Windows Forms
Опять студенты приходили, на этот раз с мелким заданием, перечислить все названия цветов в Windows Forms. Заодно уж сделал из этого задания утилитку, чтобы подбирать цвет символов на фоне в Windows Forms. Довел задание, так сказать, до логического конца. В общем, кто не успел сегодня на скайп-чатик, где я всякие мелочи объяснял и делал, ходите на Гитхаб, скачивайте там. Только не забудьте хоть что-нибудь переделать, а то преподы будут ругаться.
Принцип очень простой. Все названия цветов есть в перечислении KnownColor
, а в классе Enum
есть метод GetNames
, который позволяет получить строковый массив с именами элементов перечисления.
string[] ColorNames = Enum.GetNames(typeof(KnownColor));
Вытащить конкретное значение элемента перечисления по его имени (если оно в виде строки) можно с помощью Enum.Parse
KnownColor knownColor = (KnownColor)Enum.Parse(typeof(KnownColor), n);
n
— строковая переменная с именем.
Все остальное стандартно, заполняем в цикле GridView и красим ячейки.

Ну и в довесок в программе есть пример использования ColorDialog
и получение информации о выбранном в диалоге цвете.

И элемента управления TrackBar
для выбора цвета и фона по RGB.

Пользуйтесь на здоровье.
Исходник:
На Гитхабе
На Mega.NZ
Cкомпилированная программка
ЗЫ. Спасибо, Леха, огромное за наводку на GitEve, и удобно, можно всё мышей тыкать, не набивать километры команд в консоли, и идет на всех ОС. Все-таки с этим вашим гитом через консоль несколько неудобно работать, или я пока еще не привык.
Игра «Жизнь» на Turbo Pascal for DOS
От ведь блин, нашел лохматого возраста исходник игры «Жизнь». Писалось с другом на Turbo Pascal для DOS в лохматых годах, когда еще в школе учился.
Написано, конечно, криво, косо, неоптимизированно и все это жутко тормозит, особенно «редактирование» картинки. Но все равно круто, аж детство вспомнилось, когда не пил, не курил, мониторы были зеленее, компьютеры медленнее, Ельцин президент, а я хотел вступить в КПРФ.

https://youtu.be/W7VRyfoaOkg
Еще видео
Думал даже переписать сие произведение, Free Pascal вроде умеет в графику. Может и займусь, или найду еще более крутой исходник шизово-психоделических трехмерных графиков и сделаю из него заставку на Юнити, все равно давно хотел попробовать что-нибудь написать, чтоб с триде, да в голову ничего не приходило.
А гадский Ютуб почему-то пакостит в видео, во всяком случае, в эти. На локальной машине все четко видно, а публикуешь, как-то лажовенько выглядит, ерунда какая-то непонятная с ютубом.
Патчи от WannaCry, NotPetya и скрытых майнеров для Windows XP
Пришлось столкнуться, слава Ктулху не с самими вирями и майнерами, но с незаделанными дырками. Есть два пути обновить пожилую ОС, протестировать на наличие уязвимости Eternal Blue и заткнуть только ее, или сделать кумулятивное обновление.
Протестировать наличие дыры можно с помощью программы Eternal Blues. Пользоваться очень просто, вводим диапазон IP в локальной сети и жмем кнопку SCAN. Где в графе Vulnerable? указано YES, там дырка не заделана.

Заделываем
Качаем официальные патчи от MS
Устанавливаем, перезагружаемся, и проверяем результат программой Eternal Blues
Вот тут в прямом смысле слава Украине, а точнее конкретному украинцу под именем Simplix, который заботливо собрал все обновления со времен выхода SP3 в одну кучу, протестировал и выложил в одном пакете.
Скачать можно с его сайта simplix
Я поставил сразу тестовое обновление, но вы можете скачать то, которое уже полностью протестировано, хотя и тестовое вполне себе зашло. 5 машин и неделя времени, полет нормальный.
Установка детально описана на его же форуме.
Большой плюс для виндопользователей пиратской винды, если таковые найдутся :), после обновлений активация не слетает.
Eternal Blues
KB4012583 и KB4012598
UpdatePackLive-19.11.15 (если запускает пакет обновления с ключом /ie8, обновится IE до версии 8)
Подводный камень при чтении файла с помощью File.ReadAllText
Иногда проще прочитать файл, как текстовый в однобайтовой кодировке, чтобы что-нибудь там поделать с помощью стандартных string.Replace
/string.Remove
и т.д., иногда даже если файл не совсем текстовый, потому что таких же удобных функций для работы с массивом байт нет (или я не нашел).
Это, наверняка, адский быдлокод, но все-таки вполне альтернатива изобретению совсем уж дикого велосипеда.
А у меня речь шла о текстовых файлах, правда, неизвестно в какой кодировке, и символах, которые нужно искать/менять. Символы от кодировки не зависели, посему любой файл можно было рассматривать, как текстовый, в любой однобайтовой кодировке. Главное, в какой кодировке открыл, в той же потом и сохранить.
Так вот File.ReadAllText
пытается автоматически определить кодировку файла на основе наличия меток порядка следования байтов и принудительная установка кодировки не помогает. Если в файле встретился зловредный BOM, то ReadAllText
наплюет на твои указания кодировки с высокой колокольни и откроет в той, на которую ему BOM указывает, а при сохранении, соответственно, будет глюк и текст превратится в тыкву.
Беда, конечно, решается стандартно, чтением файла с помощью StreamReader
и записью с помощью StreamWriter
, которые себе такой самодеятельности не позволяют, но «осадочек остался».
Мухосранск. Говно. Тоскливо.
Мухосранск. Говно. Тоскливо.
Дети. Дом. Работа. Пиво.
Геморрой. Камаз. Гараж.
Десять лет водилой стаж.
Раз в пять лет с женой в кино.
Мухосранск. Тоска. Говно.
Водка. Патриот. Россия.
Шарфик красно-бело-синий.
Ящик. Киселёв на Первом.
Украина. Киев. Нервы.
Танцы. Шум. «Крымнаш». Веселье.
Утро. Санкции. Похмелье.
Цены. Доллар. Банк. Кредит.
Тёща как всегда нудит.
Снова Киселёв на Первом.
Водка. Вещмешок. Консервы.
Секс с женой как в первый раз.
Поезд. В путь. Спасать Донбасс.
Форма. Каска. Полигон.
Гумконвоем в Краснодон.
ЛНР. Блокпост. Укропы.
Первый бой. Три пули в жопе.
Страх. Обстрел. Осколок «Града».
Труп. Мешок. Рефрижератор.
Крест. Венок. Вдова. Плаксиво.
Мухосранск. Говно. Тоскливо.
Оператор наведения Дон Олесь
XuliOrganizzer. Простенький самописный органайзер на C#
Нет, оно не читается, как хули, органайзер. Но, может быть, что и подразумевается. 🙂
Это маленькая программа-органайзер для XP, 7, 8 и Vista. На 10 никто из нас ее запускать не пробовал, из за отсутствия таковой.
Что умеет:
— Собственно, напоминания по расписанию о событиях. Ну там кота покормить, или не забыть выключить самогонный аппарат, или продать славянский шкаф.

Возможны напоминания как в виде всплывающих подсказок в трее, так и в отдельном окне, повтор напоминаний через заданное время, звуковое оповещение.
Имеется возможность активировать/деактивировать задание-напоминание, есть контроль просроченных заданий и возможность немедленного выполнения таковых при старте программы.

— Запуск программ по расписанию, как с уведомлением, так и без.
— Симпатичный таймер обратного отсчета

— Текстовые заметки

Для заметок есть «корзина», т.е. случайно удаленную заметку можно восстановить.
Все данные хранятся в XML, в настройках можно посмотреть путь к файлу.
Писал в основном Леша, изредка виртуально пиная всех вокруг, и в основном для меня, потому что я давно хотел удовлетворяющий меня органайзер с напоминаниями, а в сети не было такого, который бы меня устраивал.
Распространяется свободно, как обычно, по лицензии Хекса.
Исходники: