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