Указание длины строки вывода текста
Некоторые функции шрифта и вывода текста имеют параметр, указывающий длину строки вывода текста. Типичным примером является параметр cchTextDrawTextEx.
Каждая из этих функций имеет версию ANSI и версию Юникода (например, DrawTextExA и DrawTextExWсоответственно). Для каждой функции ANSI длина указывается как число BYTE, а для функции Юникода она указывается в виде числа СЛОВ.
Традиционно это считают "количеством символов". Это, как правило, точно для многих языков, включая английский, но это не является точным в целом. В строках "ANSI" символы на кодовых страницах SBCS занимают один байт, но большинство символов на кодовых страницах DBCS занимают два байта. Аналогичным образом, большинство в настоящее время определённых символов Юникода находятся в основной многоязычной плоскости (BMP), и их представления в UTF-16 помещаются в одно слово. Однако дополнительные символы представлены в Юникоде с помощью суррогатных пар, которые требуют двух слов.
Каждая из этих функций принимает значение длины. Для каждой функции ANSI длина указывается как длина строки в байтах, не включая NULL символ. Для функции Юникода число длин — это число байтов, разделенное на sizeof(WCHAR), которое равно 2, не включая null конца. Число символов — это количество символов, которое может не совпадать с числом длин строки. В некоторых случаях символы принимают несколько байтов BYTE для ANSI (например, символы DBCS) и несколько СЛОВ для Юникода (например, суррогатные символы). Кроме того, количество глифов может не совпадать с числом символов, так как несколько символов могут быть составными, чтобы сделать один глиф. Длина данных — это их количество. Число символов — это количество единиц, обрабатываемых как одна сущность. Глифы — это то, что отображается. Например, в Юникоде можно иметь строку длиной 3, которая составляет 2 символа и приводит к отрисовке 1 глифа. Однако, как правило, длина, количество символов и количество отрисованных глифов в большинстве строк Юникода одинаковы.
Чтобы получить длину строки, можно использовать _tcslen(). Для ANSI _tcslen() возвращает количество байтов. Для Unicode функция _tcslen() возвращает количество символов WCHAR (то есть WORDов).
Специальные символы обработки, такие как вкладки и мягкие дефисы, которые не всегда рисуются, могут повлиять на выходные данные. Они включаются в длину строки и количество символов, но могут быть непосредственно не отображены визуализированным глифом.
Некоторые из этих функций позволяют вызывающему объекту указать длину как -1, чтобы указать, что строка завершается null; В этом случае функция автоматически вычисляет число символов. Не все функции предлагают эту возможность. Это указано для каждой функции отдельно; см. документацию по отдельным функциям.