2014-12-10 13 views
9

Jestem obecnie przepisywanie (część) Funkcja printf() dla szkolnego projektu. Ogólnie rzecz biorąc, byli zobowiązani do odtworzenia zachowanie funkcji z kilkoma flagami, konwersje, modyfikatory długości ...Zrozumienie i pisanie wchar_t w C

Jedyne co pozostało do zrobienia i że dostaje mi zablokowane są flagi %C/%S (lub %lc/%ls).

Do tej pory zdałem sobie sprawę, że wchar_t to typ, w którym można przechowywać znaki w więcej niż jednym bajcie, w celu akceptowania większej liczby znaków lub symboli i dlatego można je dopasować do niemal każdego języka, niezależnie od ich alfabetu i specjalnego postacie.

Jednak nie byłem w stanie znaleźć żadnych konkretnych informacji o tym, jak wygląda wchar dla maszyny, to rzeczywista długość (które najwyraźniej różnią się w zależności od kilku czynników, w tym kompilator, system operacyjny ...) lub jak właściwie je pisz.

góry dziękuję

Należy pamiętać, że jesteśmy ograniczeni w funkcjach wolno nam używać. Jedyne dozwolone funkcje są write(), malloc(), free() i exit(). Musimy być w stanie samodzielnie zakodować każdą wymaganą funkcję. Podsumowując, proszę o informacje o tym, jak interpretować i pisać "ręcznie" każdą literę o kodzie wchar_t, z możliwie jak najmniejszym kodem, aby móc zrozumieć cały proces i zakodować go. siebie.

+0

Zacznę od zwężenia tego, co 'wchar_t' może oznaczać w twojej sytuacji. W większości systemów * nix oznaczałoby to UTF-32. W Windowsie oznacza to UTF-16. Potem musisz zdecydować, jaki będzie twój wąski 'char'. W większości systemów * nix oznacza to UTF-8. Dobrą wiadomością jest to, że konwersja pomiędzy reprezentacjami Unicode jest bardzo dobrze zdefiniowana. – Mgetz

+0

'sizeof (wchar_t)' powinien nadal działać, prawda? – Kninnug

+0

@Kninnug - Działa i zwraca 4 bajty. – kRYOoX

Odpowiedz

3

Funkcja wchar_t jest podobna do znaku w tym znaczeniu, że jest liczbą, ale podczas wyświetlania znaku lub wchar_t nie chcemy widzieć liczby, ale narysowanej litery odpowiadającej liczbie. Mapowanie od liczby do znaków nie jest zdefiniowane przez char ani wchar_t, zależą one od systemu. Tak więc nie ma różnicy między końcowym użyciem char i wchar_t, z wyjątkiem ich rozmiarów.

Biorąc powyższe pod uwagę, najbardziej banalną implementacją printf ("% ls") jest takie, w którym wiesz, jakie kodowania systemowe używasz z char i wchar_t. Na przykład, w systemie, znak jest 8 bitów jest kodującego UTF-8, a wchar_t ma długość 32 bitów i kodowania UTF-32. Tak więc implementacja printf po prostu konwertuje z UTF-32 na UTF-8 i wyprowadza wynik.

Bardziej ogólnie realizacja musi obsługiwać różne kodowania i konfigurowalne i mogą wymagać, aby sprawdzić, co jest obecne kodowanie. W takim przypadku należy użyć funkcji takich jak wcsnrtombs() lub iconv().

+0

W rzeczywistości, jeśli '__STDC_ISO_10646__' jest zdefiniowany,' wchar_t' powinien przechowywać wartości kodowe Unicode, począwszy od daty określonej w tym makrze. Patrz ISO C 6.10.8.2 – ninjalj

+0

A jeśli __STDC_ISO_10646__ nie jest zdefiniowany, wtedy wchar_t nie musi przechowywać wartości kodowej Unicode. – hdante

+0

To jest dokładnie to, co zgadłem na podstawie komentarza @Mgetz do mojego pytania. Dziękujemy za potwierdzenie tego. Po przeczytaniu kodu Unicode i sposobowi manipulowania nim, mogłem zaimplementować to, czego potrzebowałem. – kRYOoX