2009-07-12 14 views
13

Obecnie badam specyfikację języka Digital Mars D i mam małe problemy ze zrozumieniem kompletnej natury prymitywnych typów postaci. Książka Learn to Tango With D jest podobnie niejasna co do możliwości i ograniczeń języka w tym obszarze.Jakie są ograniczenia pierwotnych typów znaków w D?

typy podane są na the website jak:

 
char; // unsinged 8 bit UTF-8 
wchar; // unsigned 16 bit UTF-16 
dchar; // unsigned 32 bit UTF-32 

Ponieważ wiemy, że większość transformacji Unicode (UTF) kodowania formatu reprezentacji znaków o zmiennej bitowej szerokości, to znaczy, że char w D może zawierać tylko wartości, które zmieszczą się w 8 bitach, czy rozszerza się w pamięci fizycznej maszyny, gdy podajesz znaki dwubajtowe? Być może jest jakaś inna możliwość, jak automatyczne rzucanie do następnego najbardziej odpowiedniego typu, gdy przeciążasz zmienną?

Załóżmy na przykład, chcę użyć znaku UTF-8 w edytorze i wpisać po chińsku. Czy po prostu się przewróci, czy może radzi sobie ze znakami Unicode bardziej "poprawnie", jak w C#? Czy nadal konieczne byłoby dostarczenie kodu kleju umożliwiającego pracę z dowolnym językiem obsługiwanym przez Unicode?

Byłbym wdzięczny za wszelkie szczegółowe informacje, jakie możesz zaoferować na temat tego, jak te typy działają pod kołdrą i na podstawie ogólnych wskazówek dotyczących najlepszych praktyk dotyczących radzenia sobie z ich ograniczeniami.

+0

„Skoro wiemy, że standard Unicode reprezentuje znaki o zmiennej bitowej szerokości "-> masz na myśli utf8? – elcuco

+0

Tak, mam na myśli kodowanie UFT. Przepraszam za zamieszanie. – IanGilham

Odpowiedz

15

Pojedynczy char lub wchar reprezentuje UTF code unit. Oznacza to, że samodzielnie, char w może reprezentować symbol ASCII (0-127) lub być częścią sekwencji UTF-8 reprezentującej znak Unicode (code point). Tylko typ dchar może reprezentować cały znak Unicode, ponieważ w Unicode jest więcej niż 65536 punktów kodowych.

Casting jeden rodzaj typu string (string, wstring i dstring, które są po prostu dynamiczne tablice typów znaków) nie będzie automatycznie konwertować ich zawartości do odpowiedniej reprezentacji UTF. W tym celu należy użyć funkcji toUTF8, toUTF16 i toUTF32 z std.utf (lub toString/toString16/toString32 z tango.text.convert.Utf jeśli używasz Tango).

Użytkownicy zaimplementowali klasy ciągów, które automatycznie wykorzystują najbardziej wydajną pod względem pamięci reprezentację, która może odwzorować każdy znak na pojedynczą jednostkę kodową. Pozwala to na szybkie cięcie i indeksowanie przy minimalnym obciążeniu pamięci. Jedną z takich realizacji jest mtext autorstwa Christophera E. Millera.

Dalsze czytanie:

+2

Wygląda na to, że moim problemem było zrozumienie różnicy między jednostkami kodu a punktami kodowymi. Ostatni link wyjaśnia wszystko bardzo ładnie. Dzięki. – IanGilham

+0

To samo dotyczy dodatku do pisma pana Keepa. – BCS

+1

Cieszę się, że artykuł pomógł ci. Mimo wszystko przeklinaj, CyberShadow, za odpowiedź, zanim tu dotarłem! : P –

Powiązane problemy