Указание длины текстовой строки

Некоторые функции шрифта и вывода текста имеют параметр, указывающий длину строки вывода текста. Типичным примером является параметр cchTextобъекта DrawTextEx.

Каждая из этих функций имеет версию ANSI и версию Юникода (например, DrawTextExA и DrawTextExW соответственно). Для версии "ANSI" каждой функции длина указывается в виде числа BYTE, а для функции Юникода — в виде счетчика WORD.

Это традиционно считается "числом символов". Это, как правило, верно для многих языков, включая английский, но это не точно в целом. В строках ANSI символы на кодовых страницах SBCS занимают по одному байту, но большинство символов на кодовых страницах DBCS занимают два байта. Аналогичным образом, большинство определенных в настоящее время символов Юникода находятся в базовой многоязыковой плоскости (BMP), а их представления UTF-16 помещаются в один WORD, но дополнительные символы представлены в Юникоде "суррогаты", для которых требуется два WORD.

Каждая из этих функций принимает количество длины. Для версии "ANSI" каждой функции длина указывается как длина счетчика BYTE строки, не включая признак конца NULL . Для функции Юникода значение длины — это число байтов, разделенное на sizeof(WCHAR), которое равно 2, не включая признак конца NULL . Число символов — это количество символов, которое может не совпадать с количеством длин строки. В некоторых случаях символы принимают более одного BYTE для ANSI (например, символ DBCS ) и несколько символов WORD для Юникода (например, суррогатные символы). Кроме того, количество глифов может не совпадать с количеством символов, так как несколько символов могут быть составными для создания одного глифа. Счетчик длины — это объем данных. Число символов — это количество единиц, обрабатываемых как одна сущность. Отрисовываются глифы. Например, в Юникоде может быть строка длиной 3, которая составляет 2 символа, что приводит к отображению 1 глифа. Однако обычно длина большинства строк Юникода, количество символов и количество отображаемых глифов равны.

Для получения длины строки можно использовать _tcslen(). Для ANSI _tcslen() возвращает количество байтов. Для Юникода _tcslen() возвращает количество WCHAR (то есть WORD).

Специальные символы, такие как табуляции и мягкие дефисы, которые не всегда рисуются, могут повлиять на вывод. Они включаются в длину строки и число символов, но могут не быть представлены непосредственно отображаемым глифом.

Некоторые из этих функций позволяют вызывающему объекту указать длину как -1, чтобы указать, что строка завершается null; В этом случае функция вычисляет число символов автоматически. Не все функции предоставляют эту возможность. Значение указывается в зависимости от функции; См. документацию по отдельным функциям.