PureBasic

Unicode

Введение

Юникод это термин, используемый для обозначения расширенных наборов символов, которые позволяют отображать текст на множестве языков (включая те, у которых много различных символов, вроде японского, корейского и т.д.). Он решает проблему кодировки ASCII - множество таблиц для всех языков, заменяя их на одну таблицу, где каждый символ имеет своё место. Если приложение требуется использовать в таких странах, настоятельно рекомендуется использование режима юникода с самого начала разработки, так как это уменьшит количество багов из-за преобразования из ascii в юникод.

Упрощенно, юникод можно рассматривать как большую таблицу ascii, которая содержит не 256 символов, а до 65536. Из-за этого каждый символ в юникоде требует 2 байта в памяти (важно отметить это различие, особенно при использовании Указателей на строки). Специальный тип PureBasic 'character' (.c) автоматически переключается с 1 байта на 2 байта, если используется режим Unicode.

Вот некоторые ссылки для лучшего понимания юникода (обязательное чтение):

Общая информация о unicode
Unicode и BOM

Чтобы проверить, скомпилирована ли программа в "режиме Unicode", Вы можете использовать директиву компилятора с константой #PB_Compiler_Unicode. Чтобы скомпилировать программу в "режиме Unicode", связанный параметр может быть установлен в Параметрах компилятора.

Unicode и Windows

В Windows PureBasic внутри себя использует кодировку UCS2, которая является внутренним форматом API Windows, поэтому при выполнении программы для вызова функции ОС никаких преобразований не требуется. Имея дело с функцией API, PureBasic автоматически использует юникодную версию, если таковая есть (например, MessageBox_() будет указывать на MessageBoxW() в режиме юникода, и на MessageBoxA() в режиме Ascii). Все структуры и константы API, поддерживаемые PureBasic, также автоматически переключаются на юникодную версию. Это значит, что один и тот же код API можно скомпилировать и в режиме юникода, и в режиме ascii без каких-либо изменений.

Юникод полностью поддерживается только в Windows NT и далее (Windows 2000/XP/Vista): юникодная программа не будет работать в Windows 95/98/Me. Существует решение с помощью обёрточной библиотеки 'unicows' но оно пока не поддерживается PureBasic. Если требуется поддержка Windows 9x, лучше всего поставлять две версии выполняемого файла: одна скомпилирована в ascii, другая в юникоде. Для этого нужно лишь сделать переключение в требуемый режим, это довольно быстро.

UTF-8

UTF-8 это другая юникодная кодировка, основанная на байтах. В отличие от UCS2, которая всегда занимает 2 байта на символ, UTF-8 использует кодирование переменной длины для каждого символа (до 4 байт могут обозначать один символ). Наибольшее преимущество UTF-8 - тот факт, что она не содержит в коде нулевых символов, поэтому её можно редактировать как обычный текстовый файл. Также символы ASCII от 1 до 127 сохранены на своих местах, что делает текст более или менее читаемым для латинских языков. Один недостаток это переменная длина, так что все строковые операции будут медленнее из-за необходимости предобработки для обнаружения символов в тексте.

PureBasic использует UTF-8 в качестве кодировки по умолчанию для записи и чтения строк в файлах, когда исполняемый файл находится в режиме Unicode , библиотеки (File и Preference ), таким образом, файлы полностью кросс-платформенные.

Компилятор PureBasic также обрабатывает исходные файлы в обеих кодировках, и Ascii, и UTF-8 (UTF-8 файлы должны иметь корректный заголовок BOM для корректной обработки). Оба типа файлов можно без проблем объединить в одну программу: исходный файл ASCII может включать в себя (include) исходный файл UTF-8 и наоборот. При разработке юникодной программы рекомендуется установить IDE в режим UTF-8, чтобы все исходные файлы сохранялись в UTF-8. Поскольку исходники UTF-8 также можно использовать для компиляции программы в режиме ASCII, нет необходимости изменять формат файла при каждом изменении режима.