Cómo obtener el tamaño de bytes de la cadena multibyte

¿Cómo obtengo el tamaño de byte de una cadena de caracteres multibyte en Visual C? ¿Hay una función o tengo que contar los personajes yo mismo?

O, más en general, ¿cómo obtengo el tamaño de byte correcto de una cadena TCHAR?

Solución:

_tcslen(_T("TCHAR string")) * sizeof(TCHAR) 

EDITAR:
Estaba hablando de cadenas terminadas en nulo solamente.

Según MSDN , _tcslen corresponde a strlen cuando se define _MBCS . strlen devolverá el número de bytes en la cadena. Si utiliza _tcsclen que corresponde a _mbslen que devuelve el número de caracteres multibyte.

Además, las cadenas multibyte no (AFAIK) contienen nulos incrustados, no.

Sin embargo, me cuestionaría el uso de una encoding multibyte en primer lugar … a menos que esté admitiendo una aplicación heredada, no hay razón para elegir multibyte sobre Unicode.

A ver si puedo aclarar esto:

“Cadena de caracteres de múltiples bytes” es un término vago para comenzar, pero en el mundo de Microsoft, generalmente significa “no ASCII, y no UTF-16”. Por lo tanto, podría estar usando alguna encoding de caracteres que podría usar 1 byte por carácter, o 2 bytes, o posiblemente más. Tan pronto como lo haga, la cantidad de caracteres en la cadena! = La cantidad de bytes en la cadena.

Tomemos como ejemplo UTF-8, aunque no se utilice en plataformas MS. El carácter é está codificado como “c3 a9” en la memoria, por lo tanto, dos bytes, pero 1 carácter. Si tengo la cadena “thé”, es:

 text: th é \0 mem: 74 68 c3 a9 00 

Esta es una cadena “terminada en nulo”, ya que termina con un nulo. Si quisiéramos permitir que nuestra cadena tuviera nulos, tendríamos que almacenar el tamaño de alguna otra manera, como:

 struct my_string { size_t length; char *data; }; 

… y un montón de funciones para ayudar a lidiar con eso. (Esto es una especie de cómo funciona std::string , aproximadamente).

Sin embargo, para las cadenas terminadas en nulo, strlen() calculará su tamaño en bytes , no en caracteres. (Hay otras funciones para contar caracteres). strlen solo cuenta el número de bytes antes de que vea un 0 bytes, nada del otro mundo.

Ahora, las cadenas “anchas” o “unicode” en el mundo de MS se refieren a cadenas UTF-16. ¡Tienen problemas similares en que el número de bytes! = El número de caracteres. (También: el número de bytes / 2! = El número de caracteres) Veamos de nuevo thé:

 text: th é \0 shorts: 0x0074 0x0068 0x00e9 0x0000 mem: 74 00 68 00 e9 00 00 00 

Eso es “thé” en UTF-16, almacenado en little endian (que es lo que es su escritorio típico). Note todos los 00 bytes – estos disparan hacia arriba. Por lo tanto, llamamos a wcslen , que lo considera como s de 2 bytes, no bytes simples.

Por último, tiene TCHAR , que son uno de los dos casos anteriores, dependiendo de si se ha definido UNICODE . _tcslen será la función apropiada (ya sea strlen o wcslen ), y TCHAR será char o wchar_t . TCHAR fue creado para facilitar el traslado a UTF-16 en el mundo de Windows.