wchar заканчивается одним нулевым байтом или двумя из них?

Я просто не понимаю и не могу найти много информации о конце wchar.

Если он заканчивается единичным нулевым байтом, откуда он знает, что это еще не конец строки, если что-то вроде этого «009A» представляет один из символов Unicode?

Если это заканчивается двумя нулевыми байтами? Ну, я не уверен в этом, нужно подтверждение.

8

Решение

Поскольку широкая строка — это массив широких символов, она не может даже заканчиваться однобайтовым 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
8

Другие решения

В т (цитируя тяга 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

И это не единственные возможности.

5

Здесь вы можете прочитать чуть больше широких символов: http://en.wikipedia.org/wiki/Wide_character#Size_of_a_wide_character

Завершения L ‘\ 0’, означает 16-битный ноль, так что это как два 8-битных нулевых символа.

Помните, что «009A» — это всего 1 wchar, поэтому не является нулевым wchar.

4

если вы объявите

WCHAR tempWchar[BUFFER_SIZE];

Вы делаете это нулевым

for (int i = 0; i < BUFFER_SIZE; i++)
tempWchar[i] = NULL;
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector