Префикс _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 (которая также является многобайтовой кодировкой). ).
person
Roger Lipscombe
schedule
07.05.2018
_tcsclen
_tcslen
. Каковы различия между ними? В каких случаях следует использовать тот или иной? - person Pierre   schedule 07.05.2018