Как получить размер байта многобайтовой строки

Как получить размер байта многобайтовой символьной строки в Visual C? Есть ли функция или я должен сам считать символы?

или, более общий, Как получить правильный размер байта строки TCHAR?

устранение:

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

изменить:
Я говорил о null-завершенной строки.

2 ответов


согласно MSDN, _tcslen соответствует strlen, когда _MBCS определяется. strlen возвращает число байт в строке. Если вы используете _tcsclen, что соответствует _mbslen который возвращает количество многобайтовых символы.

кроме того, многобайтовые строки (AFAIK) не содержат встроенных нулей, нет.

Я бы поставил под сомнение использование многобайтовой кодировки в первую очередь... если вы поддерживая устаревшее приложение, нет причин выбирать многобайтовый код поверх Unicode.


посмотрим, смогу ли я прояснить это:

" многобайтовая символьная строка "-это неопределенный термин для начала, но в мире Microsoft он обычно означает"не ASCII, а не UTF-16". Таким образом, вы можете использовать некоторую кодировку символов, которая может использовать 1 байт на символ или 2 байта или, возможно, больше. Как только вы это сделаете, количество символов в строке != количество байтов в строке.

давайте возьмем UTF-8 в качестве примера, хотя он не используется на МС платформ. Символ é кодируется как" c3 a9 " в памяти-таким образом, два байта, но 1 символ. Если у меня есть строка "thé", это:

text: t  h  é     
mem:  74 68 c3 a9 00

это строка" null terminated", в которой она заканчивается на null. Если бы мы хотели, чтобы в нашей строке были нули, нам нужно было бы сохранить размер каким-то другим способом, например:

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

... и множество функций, которые помогут справиться с этим. (Это своего рода как std::string строительство, довольно грубо.)

для однако строки с нулевым завершением strlen() вычислит их размер в байт, а не персонажей. (Есть и другие функции для подсчета символов) strlen просто подсчитывает количество байтов, прежде чем он видит 0 байт -- ничего особенного.

теперь строки" wide "или" unicode " в мире MS относятся к строкам UTF-16. У них похожие проблемы в том, что количество байтов != количество символов. (Также: количество байт / 2 != количество символов) давайте посмотрим на Тэ снова:

text:   t      h      é      
shorts: 0x0074 0x0068 0x00e9 0x0000
mem:    74 00  68 00  e9 00  00 00

это " thé " в UTF-16, хранящийся в little endian (это то, что ваш типичный рабочий стол). Обратите внимание на все 00 байтов - это отключение strlen. Таким образом, мы называем wcslen, который смотрит на него как 2-байтовый shorts, не один байт.

и наконец, у вас есть TCHARs, которые являются одним из двух вышеупомянутых случаев, в зависимости от if UNICODE определяется. _tcslen будет соответствующей функцией (либо strlen или wcslen), и TCHAR будет char или wchar_t. TCHAR был создан, чтобы облегчить переход к UTF-16 в мире Windows.