2012-09-06 8 views
7

Po prostu nie rozumiem i nie mogę znaleźć wiele informacji o końcu wchar.wchar kończy się pojedynczym bajtem null lub dwoma?

Jeśli kończy się on pojedynczym bajtem null, to jak wie, że nie jest to koniec łańcucha, czy coś takiego "009A" reprezentuje jeden z symboli Unicode?

Jeśli kończy się na dwóch pustych bajtach? Cóż, nie jestem tego pewien, potrzebuję potwierdzenia.

+0

języka? (Czy to nie ma znaczenia?) – John

+0

Niestety, nie rozumiem tego dobrze. Dlaczego język jest materią? Ale jeśli tak, mówię o angielskim i chińskim – Kosmos

+0

Nie :) jaki język programowania? C++? – John

Odpowiedz

6

Ponieważ szeroki ciąg znaków jest tablicą szerokich znaków, nie może nawet kończyć się jednobajtowym NUL. Jest to dwubajtowe NUL. (Tablice w C/C++ mogą zawierać tylko elementy tego samego typu, a więc tego samego rozmiaru).

Również dla znaków standardowych ASCII zawsze występuje jeden lub trzy bajty 0, ponieważ tylko znaki rozszerzone zaczynają się od niezerowego pierwszego bajtu (w zależności od tego, czy wchar_t ma szerokość 16 lub 32-bitową - dla uproszczenia, I zakładamy, 16-bitowe i ostrokońcej):

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

err, więc jeśli mam dostęp do tablicy wchar w następujący sposób: arr [0] = 0; to ustawi automatycznie na zero pierwszego i drugiego bajtu? – Kosmos

+1

Oczywiście, że tak będzie, ponieważ wchar_t ma 2 bajty ... –

+0

@Kosmos (Jeśli nie jest to jeszcze jasne, proponuję przeczytać dobry tutorial o wskaźnikach C i tablicach!) –

5

W C (podając the N1570 draft, sekcja 7.1.1):

szeroki łańcuch jest ciągłą sekwencją szerokości znaków zakończone za pierwszym szerokim znakiem o wartości zerowej.

gdzie „szerokości znaków” to wartość typu wchar_t, który jest zdefiniowany w <stddef.h> jako typ całkowitej.

Nie mogę znaleźć definicji "szerokiego łańcucha" w the N3337 draft standardu C++, ale powinno być podobne. Jedną z niewielkich różnic jest to, że wchar_t to typedef w C, a wbudowany typ (którego nazwa jest słowem kluczowym) w C++. Ale ponieważ C++ udostępnia większość biblioteki C, w tym funkcje działające na szerokich ciągach znaków, można bezpiecznie założyć, że definicje C i C++ są zgodne. (Jeśli ktoś może znaleźć coś bardziej konkretnego w standardzie C++, prosimy o komentarz lub edycję tego akapitu.)

W obu C i C++ rozmiar wchar_t jest zdefiniowany przez implementację. Zwykle jest to 2 lub 4 bajty (16 lub 32 bity, chyba że używasz bardzo egzotycznego systemu z bajtami większymi niż 8 bitów). Szeroki ciąg jest ciągiem szerokich znaków (wartości wchar_t), zakończonych szerokim znakiem zerowym. Znak kończący szeroki będzie miał taki sam rozmiar jak każdy inny szeroki znak, zwykle 2 lub 4 bajty.

W szczególności, biorąc pod uwagę, że jest większy niż wchar_tchar, A pojedynczy znaku null nie kończy szeroki łańcuch.

Warto również zauważyć, że kolejność bajtów jest definiowana przez implementację.Szeroki znak o wartości 0x1234, widzianego jako sekwencja 8-bitowych bajtach, mogą pojawić się, jak każdy z:

  • 0x12, 0x34
  • 0x34, 0x12
  • 0x00, 0x00, 0x12, 0x34
  • 0x34, 0x12, 0x00, 0x00

I to nie są jedyne możliwości.

0

jeśli deklarują

WCHAR tempWchar[BUFFER_SIZE]; 

zrobić to zerowy

for (int i = 0; i < BUFFER_SIZE; i++) 
      tempWchar[i] = NULL;