2011-12-20 6 views
5

Pracuję z biblioteką C++ i muszę utworzyć niepodpisany znak z punktu kodowego UTF-8. Na przykład, jeśli punkt kodowy to decimal 610 ("mała litera alfabetu łacińskiego G"), w jaki sposób utworzyć to w C++?C++: jak utworzyć znak bez znaku z punktu kodowego UTF-8

I javascript, mogę wykonać następujące czynności:

var temp = String.fromCharCode(610); 
console.log(temp); // Outputs a small 'G' (correct) 
var codePoint = temp.charCodeAt(0); 
console.log(codePoint); // Outputs 610 (correct) 

W C++ próbowałem:

unsigned char temp = (unsigned char)610; 
// compiles, but 
Debug::WriteLine((int)temp); // outputs 98 (??) 

Proszę podać przykład kodu w C++, która wykonuje takie same jak w przykładzie javascript powyżej.

Środowisko jest zarządzane C++, ale chcę uniknąć używania typów CLR, ponieważ łączę się z biblioteką innej firmy.

+0

Jaki jest typ 'Debug'? Czy 'Debugowanie' rozpoznaje UTF? Ponieważ ostuki C++ nie. Potrzebujesz biblioteki, aby zrobić wiele z UTF, szczególnie UTF8. –

+0

'unsigned char' ma zagwarantowane tylko wartości do 255; numer kodowy Unicode może być znacznie większy. Twój problem nie jest dobrze napisany. –

+0

Ach, życie byłoby o wiele łatwiejsze, gdyby można było to zrobić ..... –

Odpowiedz

5

unsigned char jest małe, aby utrzymać wartość 610 (przy założeniu, że znak ma 8 bitów szerokości może posiadać tylko wartości od 0 do 255), tak że będzie wrap around *

Zastosowanie char16_t do przechowywania 16 -bit char (lub char32_t dla 32-bitowego znaku, którego wymaga UTF-8).

char32_t temp = (char32_t)610; 
Debug::WriteLine(temp); // outputs 610 (!!) 

Jeśli chcesz obsługiwać UTF-8 ciągi, UTF-8 ciąg literałów:

u8"I'm a UTF-8 string." 

* Będzie owinąć wokół nawet dwa razy w przykładzie:

610 - 256 - 256 = 98

+0

Zauważ, że 'char16_t' i' char32_t' są tutaj używane jako _codepoints_. –

+0

@MooingDuck, zapomniałeś wspomnieć, że 'char16_t' nie jest wystarczająco duże, aby pomieścić każdy kod i powinno być unikane w tym celu. Ciąg znaków "char16_t" może służyć do przechowywania UTF-16 zgodnie z wymaganiami systemu Windows. –

3

Punkty kodowe Unicode mogą wymagać 32-bitowych reprezentacji. W większości zachodnich języków wystarczy 16 bitów, ale aby obsłużyć wszystkie możliwe punkty kodu Unicode, naprawdę potrzebujesz 32 bitów.

uint32_t codePoint = someString.CodePointAt(x); 

Możesz przeczytać więcej na ten temat tutaj: http://en.wikipedia.org/wiki/Code_point.

+0

Unicode używa do 21 bitów.Nie ma liczbowych typów danych, które mogłyby reprezentować 17-31 bitów danych, więc potrzebujesz 32-bitowego typu liczbowego tylko po to, aby reprezentować 21 bitów danych. –

0

Jeśli masz na myśli chcesz utworzyć unsigned char wskazując na reprezentacji UTF-8 punkt kodowy Unicode 610 mógłby zrobić:

char unsigned temp[] = { 0xc9, 0xa2 }; 
Powiązane problemy