Especificar la longitud de la cadena de salida de texto

Varias de las funciones de fuente y salida de texto tienen un parámetro que especifica la longitud de la cadena de salida de texto. Un ejemplo típico es el parámetro cchText de DrawTextEx.

Cada una de estas funciones tiene una versión "ANSI" y una versión Unicode (por ejemplo, DrawTextExA y DrawTextExW, respectivamente). Para la versión "ANSI" de cada función, la longitud se especifica como recuento de BYTES y para la función Unicode, se especifica como recuento de PALABRAs.

Es tradicional pensar en esto como un "recuento de caracteres". Por lo general, es preciso para muchos idiomas, incluido el inglés, pero no es preciso en general. En las cadenas "ANSI", los caracteres de las páginas de códigos de SBCS toman un byte cada uno, pero la mayoría de los caracteres de las páginas de códigos de DBCS toman dos bytes. Del mismo modo, la mayoría de los caracteres Unicode definidos actualmente residen en el plano multilingüe básico (BMP) y sus representaciones UTF-16 caben en una PALABRA, pero los caracteres complementarios se representan en Unicode mediante "suplentes", que requieren dos WORD.

Cada una de estas funciones toma un recuento de longitud. Para la versión "ANSI" de cada función, la longitud se especifica como una longitud de recuento byte de una cadena que no incluye el terminador NULL . Para la función Unicode, el recuento de longitudes es el recuento de bytes dividido por sizeof(WCHAR), que es 2, no incluido el terminador NULL . El recuento de caracteres es el recuento del número de caracteres, que podría no ser igual al recuento de longitud de la cadena. En algunos casos, los caracteres toman más de un BYTE para ANSI (por ejemplo, carácter DBCS ) y más de un WORD para Unicode (por ejemplo, caracteres suplentes). Además, es posible que el número de glifos no sea igual al número de caracteres porque se pueden componer varios caracteres para crear un glifo. El recuento de longitud es la cantidad de datos. El recuento de caracteres es el número de unidades que se procesan como una entidad. Los glifos son lo que se representa. Por ejemplo, en Unicode, puede tener una cadena con una longitud de 3, que es de 2 caracteres y que da como resultado que se represente un glifo. Sin embargo, normalmente, la mayoría de las cadenas Unicode longitud, recuento de caracteres y número de glifos representados son iguales.

Puede usar _tcslen() para obtener la longitud de la cadena. Para ANSI, _tcslen() devuelve el número de bytes. Para Unicode, _tcslen() devuelve el número de WCHAR (es decir, WORD).

Los caracteres de procesamiento especiales, como tabulaciones y guiones suaves que no siempre se dibujan, pueden afectar a la salida dibujada. Se incluyen en la longitud de cadena y los recuentos de caracteres, pero es posible que no se representen directamente mediante un glifo representado.

Algunas de estas funciones permiten al autor de la llamada especificar la longitud como -1 para indicar que la cadena está terminada en null; en ese caso, la función calculará el recuento de caracteres automáticamente. No todas las funciones ofrecen esta funcionalidad. Se especifica en función por función; consulte la documentación de la función individual.