В чем разница между _tcslen и _tcsclen? - PullRequest
0 голосов
/ 07 мая 2018

Я разрабатываю приложение, которое должно быть совместимо с кодировкой различных кодировок. Для этого я всегда использую TCHAR* вместо char* для определения строк. Поэтому я использую _tcslen, чтобы получить размер моих строк.

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

Единственная найденная мной ссылка, которая говорит об особенностях этой функции, это эта , и она не объясняет разницу между этими функциями.

Может кто-нибудь объяснить мне разницу между _tcslen и _tcsclen?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Префикс _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 (что является также многоступенчатым кодирование байтов).

0 голосов
/ 07 мая 2018

Когда установлен флаг компилятора Windows _MBCS , _tcslen сопоставляется с strlen, а _tcsclen сопоставляется с _mbslen. Когда установлен флаг Windows _UNICODE , общие функции отображаются на wcslen.

...