UnicodeДоброго времени суток, уважаемые подписчики. В начале сегодняшнего выпуска мы поговорим о вещах, не на прямую связанных с ассемблером, но играющих достаточно важную роль в написании любой программы. В прошлом выпуске мы столкнулись с одним очень важным моментом программирования приложений под Windows, с unicode-строками. Не смотря на то, что эта тема кажется недостойной особого внимания, не стоит её недооценивать. Конечно, в языках программирования, где программист считает char и unsigned byte абсолютно разными величинами, вопрос об использовании unicode действительно является немного второстепенным, так как всю работу берёт на себя компилятор. Но в ассемблере дела обстоят немного по другому. Каждый символ в кодировке unicode занимает одно слово (два байта), но при этом позволяет использовать 65536 символов. А это, в свою очередь, позволяет использовать гораздо больше языков, не имея проблем с кодировками. Но одновременная поддержка большего количества языков является не главной причиной того, почему я считаю использование unicode в своих программах правильным. Дело в том, что unicode позволяет обеспечивать правильное отображение любого языка на любом компьютере (конечно, с условием, что компьютер поддерживает unicode). В принципе, если вы намерены писать программы только на русском языке, и только для тех, у кого стоит русская версия Win95/98/ME (в WinNT/2K/XP немного другая ситуация), то unicode вам не нужен, но я думаю, что многоязычность программ уже давно перестала быть ненужной роскошью. Теперь, давайте вернёмся к ассемблеру и попробуем написать несколько функций, работающих со unicode-строками. Для начала напишем функцию, возвращающую длину unicode-строки.
Или функцию копирования одной unicode-строки в другую.
Не буду объяснять эту функцию так подробно, как объяснил предыдущую. Здесь тоже всё очень просто, esi и edi указывают на начало строк, eax используется как счётчик символов, а cx как буфер копирования. Как вы видите с этой точки зрения unicode-строки не сильно отличаются от обычных, надо только не забывать, что каждый символ занимает 2 байта. Не смотря на все плюсы unicode, программам зачастую приходится использовать обе кодировки, и unicode, и ANSI (а иногда и другие). Как и в примере прошлого урока, приложениям, работающим с ANSI часто приходится передавать функциям и метода строки, перекодированные в unicode. Но и программам, работающим с unicode-строками, иногда, например для записи в файл обычного текста (можно, конечно записывать и в unicode, это никто не контролирует, но пока это не принято), конвертировать unicode-строки в ANSI. Так как конвертирование строки из одного формата в другую достаточно сложно, я использую функции, которые нам предоставляет API. При помощи функции MultiByteToWideChar можно перекодировать ANSI-строку (и не только ANSI, но и OEM и Macintosh строки) в unicode-строку. Она получает следующие параметры: Вот, в принципе, и всё, что я хотел обсудить сегодня. В следующем выпуске мы рассмотрим вопрос написания приложений, работающих с unicode и запускающихся во всех версиях Win32 (но не в Windows 3.1), и попутно познакомимся с разными версиями Windows. Если есть какие вопросы, пишите. Пишите на Dark_Lord@RusFAQ.ruи свяжитесь со мной по ICQ (269764648), MSN (Dark_Lord@RusFAQ.ru) или Yahoo (durklard). Предыдущие выпуски можно найти на сайте рассылки |