Rozmiar null terminatora w różnych UTF

Rozmiar null terminatora w różnych UTF
bajos
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:UwUdź
  • Postów:267
0

Witajcie,

Czy rozmiar null terminatora w zależności od UTF się różni? Znaczy w ASCII wiadomo jest to bajt = 0, ale czy w UTF16 i 32 są to odpowiednio 2 i 4 czy też 1? Piszę dekodowanie, więc muszę zrobić StrLen dla UTF. Albo gdzie to sprawdzić?


128 postów [25.06.2015r. 21:03]
edytowany 1x, ostatnio: bajos
mwl4
  • Rejestracja:około 12 lat
  • Ostatnio:13 dni
  • Lokalizacja:Wrocław
  • Postów:399
1

ASCII / UTF8 = 1;
UTF16 = 2,
UTF32 = 4

A jeśli opierasz się na wchar_t to radzę sprawdzać sizeof, ponieważ na różnych systemach może być różny.


Asm/C/C++
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:3 minuty
1

Znak o kodzie U+0000 zakodowany w UTF-16 będzie się składał z dwóch bajtów o wartości 0, a w UTF-32 z czterech.

Albo gdzie to sprawdzić?

http://unicode.org

edytowany 3x, ostatnio: Azarien
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

UTF-8 (nie wiem jak reszta, ale pewnie podobnie) posiada znak null, ale formalnie nie wyznacza on końca ciągu znaków - długość należy trzymać osobno, np. jako struktura:

Kopiuj
struct Utf8String {
  size_t length;
  char* data;
}

Choć niektóre implementacje faktycznie (błędnie) wykorzystują go jako terminator.


edytowany 2x, ostatnio: Patryk27
Azarien
jakie znowu błędnie? tzw. c-string jest zakończony znakiem null, niezależnie od kodowania. to jakaś bzdura z tym trzymaniem długości osobno.
Patryk27
Tak, jest zakończony znakiem null i jest to błąd (uproszczenie) w implementacji. Mogę się ofc. mylić, lecz z tego co przeczytałem null character jest w pełni poprawnym znakiem w UTF-8, stąd zapisywanie długości osobno.
Azarien
w ASCII też jest „pełnoprawnym znakiem” ale w języku C string jest zdefiniowany jako ciąg znaków zakończony zerem. określamy więc, że znaki są kodowane w UTF-8 i już, działa. można sobie zdefiniować taką strukturę z osobną długością, ale to nikomu niepotrzebne - chyba że celem ma być szybkie określanie długości.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.