2010-02-09 4 views
8

Pracuję więc nad projektem C (ANSI 9899: 1999) i próbuję ustalić, od czego zacząć: Unicode, UTF-8 i cały ten jazz.Gdzie mogę rozpocząć korzystanie z programowania przyjaznego dla Unicode w C?

W szczególności jest to projekt tłumacza językowego i mam dwa główne miejsca, w których muszę obsługiwać Unicode: czytanie w plikach źródłowych (język ostentacyjnie obsługuje identyfikatory Unicode i inne) oraz w obiektach ciągowych.

Jestem zaznajomiony ze wszystkimi oczywistymi podstawami dotyczącymi Unicode, UTF-7/8/16/32 & UCS-2/4, tak i tak dalej ... W większości poszukuję użytecznej, specyficznej dla C (to znaczy, proszę, nie proszę C++ lub C#, który jest wszystkim, co zostało tu wcześniej udokumentowane na SO), co do moich "kolejnych kroków" w celu implementacji elementów przyjaznych dla Unicode ... w C.

Wszelkie linki, strony podręczników, artykuły z Wikipedii, przykładowy kod, jest bardzo mile widziany. Spróbuję także zachować listę takich zasobów tutaj w pierwotnym pytaniu, dla każdego, kto stanie się później.


+0

+1 do iconv, gdzie jest ona dostępna. na windows icu może być lepsza opcja –

Odpowiedz

10

International Components for Unicode dostarcza przenośne biblioteki C do obsługi Unicode. Oto ich skocznia dla ICU4C:

Języki C i C++ oraz wiele środowisk systemu operacyjnego nie zapewnia pełnego wsparcia dla usług obsługi tekstów zgodnych ze standardem Unicode. Mimo że niektóre platformy zapewniają dobre usługi obsługi tekstu Unicode, przenośny kod aplikacji nie może ich użyć. Biblioteki ICU4C wypełniają tę lukę. ICU4C zapewnia otwartą, elastyczną i przenośną podstawę dla aplikacji do wykorzystania w ich globalizacyjnych wymaganiach dotyczących oprogramowania. ICU4C ściśle śledzi standardy branżowe, w tym Unicode i CLDR (Common Locale Data Repository).

+0

Słyszałem o tym (myślę, że Joel wspomniał o tym w linku dodałem do pierwszego posta) ... Boję się dotknąć niczego IBM, choć wydają się zmierzać do monolitycznego oprogramowania . Bardziej szukam rzeczy, porad i takich, jak biblioteki stdlib-C niż biblioteki ... Staram się, aby moje zależności były naprawdę lekkie dla tego projektu. Powiedział, że dodam je do oryginalnego posta, mogą być przydatne dla innych. Jak ciężkie * są * jednostki intensywnej terapii? Być może, jeśli są naprawdę lekkie/proste, to jest to warte mojego czasu ... – ELLIOTTCABLE

+0

ICU to standardowy standard spoza firmy Microsoft w przetwarzaniu kodu Unicode - nie ma potrzeby używania ferrari. Chociaż krzywa uczenia się jest stroma. BTW - Jeśli tylko jesteś zainteresowany transportem i prawidłowym reprezentowaniem Unicode, nie potrzebujesz ICU. ICU dotyczy pracy z Unicode. –

+1

Uważam, że w tym konkretnym momencie, minimum, które muszę zrobić, to wczytać (przynajmniej) pliki UTF-8/ASCII i przekonwertować je na wewnętrzną tokenizowaną reprezentację ciągów znaków UTF-32. Czy mogę łatwo (-ch) robić to * bez * ICU, czy z czymś lżejszym? – ELLIOTTCABLE

0

Myślę, że jedno z interesujących pytań brzmi - jaki powinien być twój kanoniczny wewnętrzny format ciągów? W 2 oczywistych wyborów (przynajmniej dla mnie) są

a) w utf8 wanilii c-strings b) UTF16 w niepodpisane krótkich tablic

W poprzednich projektach zawsze wybiera utf8. Czemu ; ponieważ jest to ścieżka najmniejszego oporu w świecie C. Wszystko, z czym łączysz się (stdio, string.h itp.), Działa dobrze.

Dalej przychodzi - jaki format pliku.Problem polega na tym, że jest widoczny dla twoich użytkowników (chyba że podasz jedyny edytor dla twojego języka). Tutaj myślę, że musisz wziąć to, co ci dają i próbować zgadywać przez zerkanie (znaki pomocy bajtów)

3

GLib ma trochę Unicode functions i jest dość lekką biblioteką. Nie ma takiego samego poziomu funkcjonalności, jaki zapewnia ICU, ale może być wystarczająco dobry dla niektórych aplikacji. Inne cechy GLib są również dobre dla przenośnych programów C.

GTK + jest zbudowany na wierzchu GLib. GLib zapewnia podstawowe algorytmiczne konstrukcje językowe powszechnie powielane w aplikacjach. Biblioteka ta posiada funkcje, takie jak (lista ta nie jest wyczerpująca lista):

  • Obiekt i układ typu
  • Główna pętla
  • Dynamiczne ładowanie modułów (tj wtyczki)
  • wsparcie Temat
  • wsparcie czasowy
  • alokatora
  • kolejki gwintowane (synchroniczne i asynchroniczne)
  • Listy (pojedynczo związany, podwójnie związany dwustronna)
  • tabele Hash
  • Tablice
  • Drzewa (N-ary i binarne zrównoważone)
  • narzędzia ciąg i charset obchodzenia
  • leksykalna skanera i XML parser
  • base64 (kodowanie & dekodowania)