Różnice w formatach Unicode, UTF, ASCII, ANSI

351

Jaka jest różnica między tymi Unicode, UTF8, UTF7, UTF16, UTF32, ASCII, i ANSIkodowania?

W jaki sposób są one pomocne dla programistów?

web dunia
źródło

Odpowiedzi:

470

Zejście na dół listy:

  • Unicode ” nie jest kodowaniem, chociaż niestety wiele dokumentacji nieprecyzyjnie używa go w odniesieniu do dowolnego kodowania Unicode, którego domyślnie używa dany system. W systemach Windows i Java często oznacza to UTF-16; w wielu innych miejscach oznacza to UTF-8. Właściwie, Unicode odnosi się do samego abstrakcyjnego zestawu znaków, a nie do konkretnego kodowania.
  • UTF-16 : 2 bajty na „jednostkę kodu”. Jest to macierzysty format ciągów w .NET, a ogólnie w Windows i Java. Wartości poza podstawową płaszczyzną wielojęzyczną (BMP) są kodowane jako pary zastępcze. Są stosowane jako stosunkowo rzadko stosowane, ale teraz wiele zastosowań konsumenckich będzie musiał być świadomy znaków spoza BMP w celu emotikony wsparcia.
  • UTF-8 : Kodowanie o zmiennej długości, 1-4 bajtów na punkt kodowy. Wartości ASCII są kodowane jako ASCII przy użyciu 1 bajtu.
  • UTF-7 : Zwykle używany do kodowania poczty. Są szanse, że jeśli uważasz, że potrzebujesz i nie robisz poczty, mylisz się. (To tylko moje doświadczenie z publikowaniem postów w grupach dyskusyjnych itp. - poza pocztą, to naprawdę nie jest powszechnie używane).
  • UTF-32 : Naprawiono kodowanie szerokości przy użyciu 4 bajtów na punkt kodowy. To nie jest bardzo wydajne, ale ułatwia życie poza BMP. Mam Utf32Stringklasę .NET jako część mojej biblioteki MiscUtil , jeśli chcesz. (Pamiętaj, nie zostało to dokładnie przetestowane).
  • ASCII : kodowanie jednobajtowe tylko przy użyciu dolnych 7 bitów. (Punkty kodu Unicode 0–127.) Brak akcentów itp.
  • ANSI: Nie ma jednego ustalonego kodowania ANSI - jest ich wiele. Zwykle, gdy ludzie mówią „ANSI”, mają na myśli „domyślną lokalizację / stronę kodową dla mojego systemu”, która jest uzyskiwana przez Encoding.Default i często jest Windows-1252, ale mogą to być inne lokalizacje.

Jest więcej na mojej stronie Unicode i wskazówki dotyczące debugowania problemów Unicode .

Innym dużym zasobem kodu jest unicode.org, który zawiera więcej informacji niż kiedykolwiek będziesz w stanie przebrnąć przez swoją drogę - być może najbardziej użytecznym bitem są tabele kodów .

Jon Skeet
źródło
6
Termin „ANSI” w przypadku 8-bitowych stron kodowych Microsoftu jest mylący. Opierały się one na projektach zgłoszonych do standaryzacji ANSI, ale sama ANSI nigdy ich nie znormalizowała. Windows-1252 (strona kodowa najczęściej określana jako „ANSI”) jest podobna do ISO 8859-1 (Latin-1), z tym wyjątkiem, że Windows-1252 ma znaki do wydrukowania w zakresie 0x80..0x9F, gdzie ISO 8859-1 ma znaki kontrolne w tym zakresie. Unicode ma również znaki kontrolne w tym zakresie. en.wikipedia.org/wiki/Windows_code_page
Keith Thompson
1
@ jp2code: Nie zrobiłbym tego - ale musisz rozróżnić między „treścią odsyłaną przez HTTP z serwera internetowego” a „treścią wysyłaną e-mailem”. To nie treść strony internetowej wysyła wiadomość e-mail - prawdopodobnie jest to aplikacja, która za tym stoi. Treści internetowe byłyby najlepsze w UTF-8; treść wiadomości może znajdować się w UTF-7, chociaż podejrzewam, że w tej chwili można zachować to w UTF-8.
Jon Skeet
2
W przypadku UTF-16, IMHO, powiedziałbym „2 bajty na jednostkę kodu”, ponieważ punkt kodowy poza BMP będzie zakodowany w parach zastępczych jako 2 jednostki kodu (4 bajty).
Ludovic Kuty,
1
Brakuje różnic między UTF-16LE (w .NET) i BE, a także pojęcia BOM.
Maarten Bodewes,
2
@Andrew: Nie, nie ma (ogólnego) znacznika kodowania. Windows 1252 nie może reprezentować BOM Unicode i nie miałoby to sensu, ponieważ i tak jest to tylko kodowanie jednego bajta na znak.
Jon Skeet
68

Trochę lektury na początek na temat kodowania znaków: Joel na oprogramowaniu: absolutne minimum Każdy programista absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!)

Nawiasem mówiąc - ASP.NET nie ma z tym nic wspólnego. Kodowanie jest uniwersalne.

Tomalak
źródło
7
Odpowiedzi udzielono tutaj 6 lat po napisaniu artykułu. Przeczytałem go 8 lat po napisaniu posta. 14 lat później i nadal jest to dobra lektura. To ponad połowa mojego życia temu. Niesamowite.
Dave Knise