2011-10-23 13 views
12

Spojrzałem na wiele innych postów tutaj i gdzie indziej (patrz poniżej), ale nadal nie mam jednoznacznej odpowiedzi na to pytanie: w jaki sposób Windows wchar_t obsługuje znaki Unicode poza podstawową płaszczyzną wielojęzyczną?jak Windows wchar_t obsługuje znaki Unicode poza podstawową płaszczyzną wielojęzyczną?

Czyli:

Co robi system Windows, gdy chce się napisać coś w stylu (U + 2008A) Han w systemie Windows?

+1

System Windows używa UCS2 jako kodowania. –

+1

Tak też myślałem. Jednak po prostu z powodzeniem zmieniłem nazwę pliku na moim komputerze z systemem Windows, aby zawierało (U + 1D565) MATEMATYCZNĄ PODWÓJNĄ STRUKTĘ MAŁĄ T. (patrz: http://programmers.stackexchange.com/questions/102205/should-utf-16-be -przeczytane - szkodliwe). Tak więc, nawet jeśli system Windows używa UCS-2, pozwala mi umieścić znak SMP w nazwie pliku. Jak to działa? – vy32

+1

Według [Wikipedia] (http://en.wikipedia.org/wiki/NTFS#Internals), "NTFS zezwala na dowolną sekwencję 16-bitowych wartości dla kodowania nazw (nazwy plików, nazwy strumieni, nazwy indeksów itp.) Oznacza to, że obsługiwane są codepointy UTF-16, ale system plików nie sprawdza, czy sekwencja jest poprawna UTF-16 (pozwala na dowolną sekwencję krótkich wartości, nie ograniczoną do tych w standardzie Unicode) ". –

Odpowiedz

16

Implementacja wchar_t w systemie Windows stdlib to UTF-16-niepomna: wie tylko o 16-bitowych jednostkach kodu.

Możesz więc umieścić sekwencję zastępczą UTF-16 w łańcuchu i możesz traktować ją jako pojedynczy znak przy użyciu przetwarzania na wyższym poziomie. Implementacja ciągu znaków nie pomoże ci ani nie będzie przeszkadzać; pozwoli ci dołączyć dowolną sekwencję jednostek kodu w łańcuchu, nawet tych, które byłyby nieważne po interpretacji jako UTF-16.

Wiele funkcji wyższego poziomu w systemie Windows obsługuje znaki wykonane z surogatów UTF-16, dlatego można wywoływać plik .txt i wyświetlać go poprawnie i poprawnie renderować (za pomocą jednego naciśnięcia klawisza, a nie dwóch , aby przejść obok postaci) w programach takich jak Explorer, które obsługują złożony układ tekstu (zazwyczaj przy użyciu biblioteki Uniscribe systemu Windows).

Ale są jeszcze wolne miejsca, gdzie można zobaczyć UTF-16-nieświadomości świecące przez, takie jak fakt, można utworzyć plik o nazwie .txt w tym samym folderze co .txt, gdzie przypadek niewrażliwość przeciwnym razie nie pozwolić na to, czy fakt, że można programowo utworzyć [U+DC01][U+D801].txt.

W ten sposób pedanci mogą mieć ładną długą i praktycznie bezsensowną argumentację na temat tego, czy Windows "obsługuje" ciągi UTF-16 czy tylko UCS-2.

+2

+1 za "wspiera". Najpierw zdefiniuj swoją nomenklaturę, a następnie argumentuj. :) –

+0

Te ".txt" są takie same ("?") Dla mnie w Chrome, to nie jest zamierzone, prawda? ;) – mlvljr

7

System Windows używał UCS-2, ale adoptował UTF-16 w Windows 2000. Windows wchar_t API teraz produkuje i zużywa UTF-16.

Nie wszystkie programy osób trzecich obsługują to poprawnie, więc mogą mieć problemy z danymi poza BMP.

Należy również zauważyć, że kodowanie UTF-16, o zmiennej długości, nie jest zgodne z wymaganiami C lub C++ dla kodowania używanego z wchar_t. Powoduje to pewne problemy, takie jak niektóre standardowe funkcje, które pobierają pojedynczy plik wchar_t, taki jak wctomb, nie mogą obsługiwać znaków spoza BMP w systemie Windows i Windows definiujący niektóre dodatkowe funkcje, które używają szerszego typu, aby móc obsługiwać pojedyncze znaki poza BMP. Zapomniałem jaka to była funkcja, ale wpadłem na funkcję Windows, która zwróciła int zamiast wchar_t (i nie było to gdzie EOF był możliwym wynikiem).

Powiązane problemy