Я просто не понимаю и не могу найти много информации о конце wchar.
Если он заканчивается единичным нулевым байтом, откуда он знает, что это еще не конец строки, если что-то вроде этого «009A» представляет один из символов Unicode?
Если это заканчивается двумя нулевыми байтами? Ну, я не уверен в этом, нужно подтверждение.
Поскольку широкая строка — это массив широких символов, она не может даже заканчиваться однобайтовым NUL. Это двухбайтовый NUL. (Массивы в C / C ++ могут содержать только элементы одного типа, поэтому одинакового размера).
Кроме того, для стандартных символов ASCII всегда есть один или три однобайтовых 0, поскольку только расширенные символы начинаются с ненулевого первого байта (в зависимости от того, wchar_t
имеет ширину 16 или 32 бита — для простоты я предполагаю 16-битный и little-endian):
HELLO is 72 00 69 00 76 00 76 00 79 00 00 00
В т (цитируя тяга N1570, раздел 7.1.1):
широкая строка является непрерывной последовательностью широких символов, оканчивающихся
включая первый нулевой широкий символ.
где «широкий символ» является значением типа wchar_t
, который определен в <stddef.h>
как целочисленный тип.
Я не могу найти определение «широкой строки» в проект N3337 стандарта C ++, но он должен быть похожим. Одно небольшое отличие состоит в том, что wchar_t
это typedef в C и встроенный тип (имя которого является ключевым словом) в C ++. Но поскольку C ++ разделяет большую часть библиотеки C, включая функции, которые работают с широкими строками, можно с уверенностью предположить, что определения C и C ++ совместимы. (Если кто-то может найти что-то более конкретное в стандарте C ++, прокомментируйте или отредактируйте этот абзац.)
И в C, и в C ++ размер wchar_t
определяется реализацией. Обычно это 2 или 4 байта (16 или 32 бита, если только вы не используете очень экзотическую систему с байтами больше 8 бит). Широкая строка — это последовательность широких символов (wchar_t
значения), заканчивается нулевым широким символом. Завершающий широкий символ будет иметь тот же размер, что и любой другой широкий символ, обычно 2 или 4 байта.
В частности, учитывая, что wchar_t
больше чем char
, не замужем нулевой байт не заканчивается широкой строкой.
Также стоит отметить, что порядок байтов определяется реализацией. Широкий символ со значением 0x1234
при просмотре в виде последовательности 8-битных байтов может выглядеть как любой из:
0x12
, 0x34
0x34
, 0x12
0x00
, 0x00
, 0x12
, 0x34
0x34
, 0x12
, 0x00
, 0x00
И это не единственные возможности.
Здесь вы можете прочитать чуть больше широких символов: http://en.wikipedia.org/wiki/Wide_character#Size_of_a_wide_character
Завершения L ‘\ 0’, означает 16-битный ноль, так что это как два 8-битных нулевых символа.
Помните, что «009A» — это всего 1 wchar, поэтому не является нулевым wchar.
если вы объявите
WCHAR tempWchar[BUFFER_SIZE];
Вы делаете это нулевым
for (int i = 0; i < BUFFER_SIZE; i++)
tempWchar[i] = NULL;