Строки

From SunFlurry wiki
Jump to: navigation, search

Строки, наряду с числами, это основные объекты хранения для данных в системе. Каждая строка может содержать до 2 млрд. символов. Строки используются для хранения и обработки текстов, бинарных данных, передачи параметров внутри системы и во внешние источники, для вывода информации и пр. Способы использования строк разнообразны, поэтому, строковые объекты имеют определенные оптимизации для ускорения работы с ними (см. статью для доп. информации). Система использует строковые объекты двух типов:

  • ANSI строки, называемые также однобайтовые строками. Каждый знак занимает один байт. Строка будет иметь системную кодировку для международных символов. К примеру, если установки текущей учетной записи системы определяют ANSI строки, как имеющие кодовую страницу 1251, то в однобайтовых строках, наряду с латиницей, знаками и цифрами, можно использовать кириллицу, если же, к примеру, кодовая страница 869, то в ANSI строках можно использовать греческий алфавит. Система обычно использует такие объекты только для хранения строк с латиницей, знаками и цифрами, при наличии любого международного символа, происходит автоматическое преобразование в UTF-16 строку. Нужно также заметить, что системная кодировка для таких строк имеет значение только при их выводе на экран, кроме как при выводе информации, кодировка никак не влияет на содержимое строк.
  • UTF-16 строки, называемые также многобайтовыми строками или юникодом (Unicode). В данной кодировке каждый знак обычно занимает два байта (либо большее количество для редких знаков). В строках такого типа может храниться любая текстовая информация с международными символами, они не зависят от текущей системной кодировки, однако, занимают больше места в памяти и не подходят для хранения и преобразования бинарной информации (к примеру, как результат шифрования алгоритмом AES и пр.).
    • Важное замечание: стандарт Unicode предполагает использование символов с кодами больше 65535. Для таких символов требуется не 2 байта, а 4 байта при хранении текста (первые два байта называют нижним суррогатом, последние -- верхним). 2-байтовый юникод, называемый также BMP (Basic Multilingual Plane, основная международная таблица) или UCS-2, позволяет кодировать все основные международные символы, включая Китайские, Японские и Корейские иероглифы. Символы вне этой таблицы, обычно представляют собой символику вымерших или редких языков и знаки, не относящиеся к обычному тексту (смайлики, рисунки объектов и пр.), либо знаки, зависящие непосредственно от шрифта. Такие знаки зачастую не будут даже иметь корректного отображения, так как большинство шрифтов не поддерживает полную таблицу юникода. Говоря о возможностях системы, при выводе на экран и перекодировке текста, знаки вне BMP обрабатываются системой корректно, однако, текстовые функции рассчитаны только на работу с символами, размером 2 байта. Это, значит, к примеру, что в редакторе исходного кода, можно создать строку "𐒀𐒁𐒂𐒃𐒄𐒅𐒆𐒇𐒈𐒉𐒊𐒋𐒌𐒍𐒎𐒏", визуально имеющую длину 16 символов, однако, с точки зрения UTF-16 эта строка представлена 64-мя байтами информации, так как каждый ее символ записан двумя двухбайтовыми парами (первый знак, например, записан сл. образом: D801,DC80). Поэтому функция Length возвратит 32, а не 16, функция Pos при нахождении позиции знака 𐒆 возвратит некорректную позицию 13, вместо корректной 7, однако, функция TearStr будет работать корректно. В связи с этим не рекомендуется использовать международные символы вне двухбайтовой таблицы BMP, либо не нужно производить обработку текста с их наличием обычным функционалом.

Преобразование в UTF-16 строку в системе обычно происходит автоматически, обратное преобразование можно осуществить с помощью особых функций. Также нужно отметить, что широко используемый формат UTF-8 будет храниться в системе в ANSI (однобайтовых строках), при получении из внешних источников текста в таком формате, желательно преобразовать его в UTF-16 (c помощью, к примеру UTF8ToUnicode), затем, после обработки, можно преобразовать текст обратно в UTF-8 (к примеру, используя UnicodeToUTF8).

Ниже показаны примеры некоторых функций, для работы с форматом и преобразованием строк:

  • Синтаксис массивов <Переменная>[<Индекс>] позволяет получить доступ к символу строки по его индексу (индекс начинается с единицы). При изменении символа с помощью конструкции <Переменная>[<Индекс>]:=<Значение>, значение может быть не только текстовым, но и числовым (содержать код символа). Важно: оригинальная строка в ANSI не будет преобразована в UTF-16, даже если присваиваемый символ является международным, в этом случае, будет вызвано исключение, либо символ будет утерян (превращен в "?").
  • Функции для преобразования объекта в текстовое представление: Str, NumberToStr и пр.
  • Функции, определяющие тип строки (однобайтовая или многобайтовая): StringTypeStr, IsUnicode
  • Функции для преобразования между типами строк: Ansi, Unicode
  • Функции для преобразования между кодировками строк: UnicodeToUTF8, UTF8ToUnicode, AnsiToUTF8, UTF8ToAnsi, TranslateFrom, TranslateTo, Translate и пр.