2012-09-06 3 views
7

Я просто не понимаю и не могу найти много информации о конце wchar.wchar заканчивается одиночным нулевым байтом или двумя из них?

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

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

+0

Язык? (Или это не имеет значения?) – John

+0

Извините, я не понимаю это хорошо. Почему язык - это вопрос? Но если да, я говорю об английском и китайском – Kosmos

+0

Нет :) какой язык программирования? C++? – John

ответ

6

Поскольку широкая строка представляет собой массив широких символов, она не может даже закончиться однобайтным NUL. Это двухбайтовый NUL. (Массивы в C/C++ могут содержать только те же элементы, которые имеют одинаковый размер).

Кроме того, для стандартных символов ASCII всегда один или три однобайтных 0, поскольку только расширенные символы начинаются с ненулевого первого байта (в зависимости от того, является ли wchar_t шириной 16 или 32 бит - для простоты, I предположим, 16 бит и мало-Endian):

HELLO is 72 00 69 00 76 00 76 00 79 00 00 00 
+0

err, поэтому, если я обращаюсь к массиву wchar: arr [0] = 0; он автоматически установит нулевой первый и второй байты? – Kosmos

+1

Конечно, это будет, так как wchar_t равно 2 байтам ... –

+0

@ Kosmos (Если это еще не ясно, я предлагаю вам прочитать хороший учебник по C указателям и массивам!) –

4

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

Концевые являются L «\ 0», означает 16-битный нуль, так что это как два 8-битных нулевых символов.

Помните, что «009A» - это только 1 wchar, так что это не пустой wchar.

5

В C (со ссылкой на the N1570 draft, раздел 7.1.1):

широкая строка представляет собой непрерывную последовательность широких символов прекращается , включая первый нулевой широкий символ.

, где «широкий характер» значение типа wchar_t, который определен в <stddef.h> как целого типа.

Я не могу найти определение «широкая строка» в the N3337 draft стандарта 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

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

0

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

WCHAR tempWchar[BUFFER_SIZE]; 

вы сделаете это пустой

for (int i = 0; i < BUFFER_SIZE; i++) 
      tempWchar[i] = NULL; 
Смежные вопросы