Если вы заметили, первая группа функций, которую вы упомянули, это все функции ASCII, и поэтому в этом случае нет никакой разницы - количество байтов - это количество символов. Это потому, что (как правило, в любом случае) один символ ASCII имеет размер только один байт.
Вторая группа - это функции / структуры Юникода. В этом случае символы не гарантированно будут иметь размер только один байт - если в формате UTF16 они будут иметь ширину в два байта, в UTF32 их будет четыре, а в UTF8 они (как правило) будут где-то от ширина от одного до четырех байтов.
В частности, в случае данных UTF8, если вы создаете буфер, обычно вы откладываете определенное количество байт , которое в зависимости от размеров символов может быть весьма разнообразным по количеству символов. Я не слишком знаком с большинством представленных вами функций / структур, но меня не удивит, если это как-то связано с этим.
Чтобы ответить на ваш вопрос, если вы работаете с ASCII, вы можете использовать любой из этих подходов - без разницы. Однако, если вы работаете с кодировками переменной длины (такими как UTF8), то, используете ли вы один или другой, зависит от того, заинтересованы ли вы только в задействованных символах, или вам также необходимо учитывать их кодировку.