Префикс _t
означает, что это функции обработки текста (на самом деле макросы), которые отображаются на разные реализации, в зависимости от того, компилируете ли вы «Unicode» (на самом деле UTF-16) или нет.
Когда вы компилируете для Unicode (установлено _UNICODE
), они отображаются на одну и ту же функцию, wcslen
, которая возвращает длину строки в широких (двухбайтовых) символах.
Когда вы не компилируете для Unicode (установлено _MBCS
), они отображаются на разные функции:
_tcslen
отображается на strlen
, что возвращает длину строки в байтах . Это сделано для того, чтобы вы могли распределять буферы правильного размера.
_tcsclen
отображается на _mbslen
, документация по которой довольно скудна. Я догадываюсь , но c
в _tcsclen
означает символов .
Разница между символами и байтами заключается в том, что в многобайтовой кодировке конкретный символ может занимать от одного до трех байтов. Таким образом: _tcsclen
(_mbslen
) говорит вам, сколько символов в строке, что полезно для рендеринга, а _tcslen
(strlen
) сообщает, сколько байтов в строке, что вам нужно для памяти распределение.
В общем, если вы работаете в основном под Windows, вы просто скомпилируете для Unicode и покончите с этим. Вам нужно иметь дело с другими кодировками символов, если вы разговариваете с другой системой (чтение / запись файлов, сетевые сообщения и т. Д.), И вы обычно конвертируете в и из UTF-8.
Обратите внимание, что когда документация Windows SDK ссылается на «многобайтовую», это означает более старые многобайтовые кодировки, такие как Shift-JIS, а не UTF-8 (что является также многоступенчатым кодирование байтов).