Jaka jest różnica między ASCII a Unicode?

Odpowiedzi:

534

ASCII definiuje 128 znaków, które są odwzorowane na liczby 0–127. Unicode definiuje (mniej niż) 2 21 znaków, które podobnie odwzorowują na liczby 0–2 21 (chociaż nie wszystkie liczby są obecnie przypisane, a niektóre są zastrzeżone).

Unicode jest nadzbiorem ASCII, a liczby 0–127 mają takie samo znaczenie w ASCII, jak w Unicode. Na przykład liczba 65 oznacza „łacińska stolica„ A ”.

Ponieważ znaki Unicode zazwyczaj nie mieszczą się w jednym 8-bitowym bajcie, istnieje wiele sposobów przechowywania znaków Unicode w sekwencjach bajtów, takich jak UTF-32 i UTF-8.

Kerrek SB
źródło
4
@riderBill: Co teraz? O których 3 bitach mówisz? Nie ma bitów w Unicode. Tylko punkty kodowe.
Kerrek SB
@riderBill: znowu: o jakich „3 bajtach” mówisz teraz? :-) (Nie ma to nic wspólnego z Unicode. Unicode dotyczy jedynie przypisywania znaczenia liczbom, nie chodzi o bity i bajty.)
Kerrek SB
8
@riderBill: Unicode nie „używa od 1 do 4 bajtów”. Unicode to przypisanie znaczenia liczbom. Nie używa żadnych bajtów. Istnieją pewne znormalizowane schematy kodowania reprezentujące punkty kodowe Unicode jako strumień bajtów, ale są one ortogonalne w stosunku do Unicode jako zestawu znaków. (Tak, możesz usunąć, jak chcesz.)
Kerrek SB
@CleanCrispCode Unicode jest tak naprawdę nadzbiorem ISO-8859-1 , który sam jest nadzbiorem ASCII. Czasami warto to wiedzieć.
Mark Ransom,
8
Aby wyjaśnić, Unicode zestaw znaków sama jest rozszerzeniem ISO-8859-1 zestawu znaków , ale UTF-8 kodowania jest nie rozszerzeniem ISO-8859-1 kodowania ale ASCII kodowania .
minmaxavg
392

Zrozumienie, dlaczego ASCII i Unicode zostały stworzone, pomogło mi zrozumieć różnice między nimi.

ASCII, Origins

Jak stwierdzono w innych odpowiedziach, ASCII używa 7 bitów do przedstawienia znaku. Używając 7 bitów, możemy uzyskać maksymalnie 2 ^ 7 (= 128) różnych kombinacji * . Co oznacza, że ​​możemy przedstawić maksymalnie 128 znaków.

Czekaj, 7 bitów? Ale dlaczego nie 1 bajt (8 bitów)?

Ostatni bit (8) służy do unikania błędów jako bitu parzystości . To było ważne lata temu.

Większość znaków ASCII to znaki alfabetu, które można wydrukować, takie jak abc, ABC, 123,? &! Itd. Inne to znaki sterujące, takie jak znak powrotu karetki, przesunięcie wiersza , tab itp.

Zobacz poniżej binarną reprezentację kilku znaków w ASCII:

0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)

Zobacz pełną tabelę ASCII tutaj .

ASCII był przeznaczony tylko dla języka angielskiego.

Co? Dlaczego tylko angielski? Tak wiele języków!

Ponieważ w tym czasie centrum przemysłu komputerowego znajdowało się w USA. W związku z tym nie musieli obsługiwać akcentów ani innych znaków, takich jak á, ü, ç, ñ itp. (Aka diakrytyczne ).

ASCII Extended

Niektórzy sprytni ludzie zaczęli używać ósmego bitu (bitu używanego do parzystości) do kodowania większej liczby znaków w celu obsługi ich języka (na przykład obsługi „é” w języku francuskim). Wystarczy jeden dodatkowy bit podwoić rozmiar oryginalnej tabeli ASCII, aby zmapować do 256 znaków (2 ^ 8 = 256 znaków). I nie 2 ^ 7 jak poprzednio (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

Nazwę tego „ASCII rozszerzono do 8 bitów, a nie 7 bitów jak poprzednio” można by nazwać po prostu „rozszerzonym ASCII” lub „8-bitowym ASCII”.

Jak zauważył @Tom w swoim komentarzu poniżej, nie ma czegoś takiego jak „ rozszerzony ASCII ”, ale jest to łatwy sposób na odniesienie się do tej 8-bitowej sztuczki. Istnieje wiele odmian 8-bitowej tabeli ASCII, na przykład ISO 8859-1, zwanej także ISO Latin-1 .

Unicode, The Rise

ASCII Extended rozwiązuje problem języków opartych na alfabecie łacińskim ... a co z innymi, którzy potrzebują zupełnie innego alfabetu? Grecki? Rosyjski? Chińczycy i polubienia?

Potrzebowalibyśmy zupełnie nowego zestawu znaków ... to racjonalność stojąca za Unicode. Unicode nie zawiera wszystkich znaków z każdego języka, ale z pewnością zawiera gigantyczną liczbę znaków ( patrz tabela ).

Nie można zapisać tekstu na dysku twardym jako „Unicode”. Unicode to abstrakcyjna reprezentacja tekstu. Musisz „zakodować” tę abstrakcyjną reprezentację. Tam właśnie zaczyna się kodowanie .

Kodowanie: UTF-8 vs UTF-16 vs UTF-32

Ta odpowiedź całkiem dobrze wyjaśnia podstawy:

  • UTF-8 i UTF-16 są kodowaniem o zmiennej długości.
  • W UTF-8 znak może zajmować minimum 8 bitów.
  • W UTF-16 długość znaku zaczyna się od 16 bitów.
  • UTF-32 to kodowanie o stałej długości 32 bitów.

UTF-8 używa zestawu ASCII dla pierwszych 128 znaków. Jest to przydatne, ponieważ oznacza, że ​​tekst ASCII jest również poprawny w UTF-8.

Mnemonika:

  • UTF- 8 : minimum 8 bitów.
  • UTF- 16 : minimum 16 bitów.
  • UTF- 32 : minimum i maksimum 32 bity.

Uwaga:

Dlaczego 2 ^ 7?

Dla niektórych jest to oczywiste, ale na wszelki wypadek. Mamy siedem dostępnych miejsc wypełnionych 0 lub 1 ( kod binarny ). Każda może mieć dwie kombinacje. Jeśli mamy siedem miejsc, mamy 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 kombinacji. Pomyśl o tym jako o kombinacji zamka z siedmioma kołami, z których każde ma tylko dwie cyfry.

Źródło: Wikipedia , ten świetny post na blogu i Mocki, gdzie początkowo opublikowałem to streszczenie.

Andrzej
źródło
7
Nie ma tekstu, ale kodowany. Niektóre kodowania są bardzo proste, szczególnie dla zestawów znaków o <= 256 współrzędnych kodowych. „Rozszerzony ASCII” to bardzo dwuznaczny termin; niektóre obsługują grecki, rosyjski i / lub polski. ASCII jest niewystarczający dla tekstu w języku angielskim, który używa á, ü, ç, ñ. Podejrzewam, że został zaprojektowany do obsługi języków komputerowych, a nie ludzkich. Dogmatycznie, kiedy piszesz plik lub strumień, masz zestaw znaków i wybierasz kodowanie. Twój czytelnik musi uzyskać bajty i wiedzę o tym, jakie kodowanie. W przeciwnym razie komunikacja nie powiodła się.
Tom Blodget
Dziękuję bardzo za uzupełnienie. Odpowiednio zaktualizowałem odpowiedź.
Andrew
Dziękuję Ci. Zauważam, że wszędzie tabele ASCII pokazują kody znaków jako 0-127, ale tabele UTF-8 pokazują kody jako szesnastkowe, a nie całkowite. Czy jest tego powód? Dlaczego tabele UTF-X nie pokazują 0-127 / 255/65535 w porównaniu z 00-AF? Czy to coś znaczy?
wayofthefureure
Dziękuję za odpowiedź. Szybkie pytanie: „W UTF-16 długość znaku zaczyna się od 16 bitów” - Czy to oznacza, że ​​znaki alfanumeryczne nie mogą być reprezentowane przez UTF-16, ponieważ są to tylko znaki 8-bitowe?
Moondra
Świetna odpowiedź, mam tylko jeden problem - czy polski naprawdę używa innego alfabetu? Myślałem, że używamy tego samego co angielski, tylko z dodatkowymi literami?
Nicofisi
89

ASCII ma 128 punktów kodowych, od 0 do 127. Może zmieścić się w jednym 8-bitowym bajcie, wartości od 128 do 255 zwykle były używane dla innych znaków. Z niezgodnymi wyborami, powodując katastrofę strony kodowej . Tekst zakodowany na jednej stronie kodowej nie może być poprawnie odczytany przez program, który zakłada lub zgaduje na innej stronie kodowej.

Unicode przyszło rozwiązać tę katastrofę. Wersja 1 rozpoczęła się od 65536 punktów kodowych, zwykle zakodowanych w 16 bitach. Później rozszerzony w wersji 2 do 1,1 miliona punktów kodowych. Obecna wersja to 6.3, wykorzystująca 110 187 z dostępnych 1,1 miliona punktów kodowych. To już nie pasuje do 16 bitów.

Kodowanie w 16 bitach było powszechne, gdy pojawiła się wersja v2, używana na przykład w systemach operacyjnych Microsoft i Apple. I środowiska wykonawcze takie jak Java. Specyfikacja v2 wymyśliła sposób odwzorowania tych 1,1 miliona punktów kodowych na 16-bitowe. Kodowanie o nazwie UTF-16, kodowanie o zmiennej długości, w którym jeden punkt kodowy może zająć 2 lub 4 bajty. Pierwotne punkty kodu v1 zajmują 2 bajty, a dodane 4.

Innym bardzo popularnym kodowaniem o zmiennej długości, stosowanym w systemach operacyjnych i narzędziach * nix, jest UTF-8, kod może zająć od 1 do 4 bajtów, oryginalne kody ASCII zajmują 1 bajt, a reszta zajmuje więcej. Jedynym kodowaniem o zmiennej długości jest UTF-32, zajmuje 4 bajty na punkt kodowy. Nie jest często używany, ponieważ jest dość marnotrawny. Są też inne, takie jak UTF-1 i UTF-7, powszechnie ignorowane.

Problem z kodowaniem UTF-16/32 polega na tym, że kolejność bajtów będzie zależeć od endiczności komputera, który utworzył strumień tekstu. Dodaj więc do miksu UTF-16BE, UTF-16LE, UTF-32BE i UTF-32LE.

Posiadanie tych różnych opcji kodowania przywraca do pewnego stopnia katastrofę strony kodowej, a także ożywione debaty wśród programistów, które wybór UTF jest „najlepszy”. Ich skojarzenie z domyślnymi ustawieniami systemu operacyjnego wyznacza granice. Jedną z przeciwdziałań jest definicja BOM, Byte Order Mark, specjalnego punktu kodowego (U + FEFF, przestrzeń o zerowej szerokości) na początku strumienia tekstowego, który wskazuje, w jaki sposób kodowana jest reszta strumienia. Wskazuje zarówno kodowanie UTF, jak i endianowość i jest neutralny dla mechanizmu renderowania tekstu. Niestety jest to opcjonalne i wielu programistów twierdzi, że ma prawo go pominąć, więc wypadki wciąż są dość częste.

Hans Passant
źródło
31

java zapewnia obsługę Unicode, tzn. obsługuje wszystkie alfabety z całego świata. Stąd wielkość znaków w java wynosi 2 bajty. Zakres wynosi od 0 do 65535.

wprowadź opis zdjęcia tutaj

Siddarth Kanted
źródło
Zdjęcie do wyjaśnienia. Miło
Ponmari Subramanian
2
Szkoda, że ​​jest źle. „Kody ASCII (128)” byłyby poprawne.
Mark Tolonen,
15

ASCII ma 128 pozycji kodu przypisanych do znaków graficznych i znaków kontrolnych (kodów kontrolnych).

Unicode ma 1124112 pozycji kodu. Około 100 000 z nich zostało obecnie przypisanych do znaków, a wiele punktów kodowych zostało trwale nie znakowych (tj. Nigdy nie jest wykorzystywanych do kodowania żadnego znaku), a większość punktów kodowych nie została jeszcze przypisana.

Jedyne rzeczy, które ASCII i Unicode mają wspólną cechą są: 1) Są kody znaków. 2) Zdefiniowano 128 pierwszych pozycji kodu Unicode, które mają takie samo znaczenie jak w ASCII, z tym wyjątkiem, że pozycje kodu znaków kontrolnych ASCII są po prostu zdefiniowane jako oznaczające znaki kontrolne, z nazwami odpowiadającymi ich nazwom ASCII, ale ich znaczenie jest nie zdefiniowano w Unicode.

Czasami jednak Unicode jest określany (nawet w standardzie Unicode!) Jako „szeroki ASCII”. Jest to hasło, które głównie stara się przekazać ideę, że Unicode ma być uniwersalnym kodem znaków w taki sam sposób, jak kiedyś ASCII (chociaż repertuar znaków ASCII był beznadziejnie niewystarczający do uniwersalnego zastosowania), w przeciwieństwie do używania różnych kodów w różne systemy i aplikacje oraz dla różnych języków.

Unicode jako takie definiuje tylko „logiczny rozmiar” znaków: Każdy znak ma numer kodu w określonym zakresie. Te numery kodów mogą być prezentowane przy użyciu różnych kodowań przesyłania, a wewnętrznie w pamięci znaki Unicode są zwykle reprezentowane przy użyciu jednej lub dwóch 16-bitowych ilości na znak, w zależności od zakresu znaków, czasami przy użyciu jednej 32-bitowej ilości na znak.

Jukka K. Korpela
źródło
2
Myślę, że obecnie najbardziej popularnym kodowaniem Unicode jest UTF-8. UTF-8 koduje większość punktów kodowych w 1, 2 lub 3 bajtach.
Binarus
14

ASCII i Unicode są kodowaniami dwóch znaków. Zasadniczo są to standardy reprezentowania binarnych znaków różnicowych, aby można je było zapisywać, przechowywać, przesyłać i czytać w mediach cyfrowych. Główną różnicą między nimi jest sposób kodowania znaku i liczba bitów, których używają dla każdego z nich. ASCII pierwotnie użył siedmiu bitów do zakodowania każdego znaku. Zostało to później zwiększone do ośmiu dzięki rozszerzonemu ASCII, aby zaradzić pozornej nieadekwatności oryginału. W przeciwieństwie do tego Unicode używa programu do kodowania o zmiennej liczbie bitów, w którym można wybierać między kodowaniem 32, 16 i 8-bitowym. Korzystanie z większej liczby bitów pozwala używać większej liczby znaków kosztem większych plików, a mniej bitów daje ograniczony wybór, ale oszczędzasz dużo miejsca. Korzystanie z mniejszej liczby bitów (tj

Jednym z głównych powodów, dla których problemem był Unicode, było wiele niestandardowych rozszerzonych programów ASCII. O ile nie korzystasz z dominującej strony, która jest używana przez Microsoft i większość innych firm programistycznych, możesz napotkać problemy z postaciami wyświetlanymi jako pola. Unicode praktycznie eliminuje ten problem, ponieważ wszystkie punkty kodowe znaków zostały znormalizowane.

Kolejną ważną zaletą Unicode jest to, że maksymalnie może pomieścić ogromną liczbę znaków. Z tego powodu Unicode zawiera obecnie większość języków pisanych i wciąż ma miejsce na jeszcze więcej. Obejmuje to typowe skrypty od lewej do prawej, takie jak angielski, a nawet skrypty od prawej do lewej, takie jak arabski. Chiński, japoński i wiele innych wariantów jest również reprezentowanych w Unicode. Dlatego Unicode nie zostanie wkrótce zastąpiony.

Aby zachować kompatybilność ze starszym ASCII, który był wówczas w powszechnym użyciu, Unicode został zaprojektowany w taki sposób, aby pierwsze osiem bitów pasowało do najpopularniejszej strony ASCII. Jeśli więc otworzysz plik zakodowany w formacie ASCII za pomocą Unicode, nadal otrzymasz prawidłowe znaki zakodowane w pliku. Ułatwiło to przyjęcie Unicode, ponieważ zmniejszyło wpływ przyjęcia nowego standardu kodowania dla tych, którzy już używali ASCII.

Podsumowanie:

1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.

Zaczerpnięte z: http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs

Nikhil Katre
źródło
1

Przechowywanie

Podane liczby służą tylko do przechowywania 1 znaku

  • ASCII ⟶ 2 7 bitów ( 1 bajt )
  • Rozszerzony ASCII ⟶ 2 8 bitów (1 bajt)
  • UTF-8 ⟶ minimum 2 8 , maksymalnie 2 32 bity (min. 1, maks. 4 bajty)
  • UTF-16 ⟶ minimum 2 16 , maksimum 2 32 bity (min. 2, maks. 4 bajty)
  • UTF-32 ⟶ 2 32 bity (4 bajty)

Zastosowanie (od lutego 2020 r.)

Odsetki witryn korzystających z różnych kodowań znaków

Hasan Sefa Ozalp
źródło
0

ASCII definiuje 128 znaków, ponieważ Unicode zawiera repertuar ponad 120 000 znaków.

sphynx888
źródło
4
-1 dla tego trywialnego duplikatu „Odpowiedź”, nie dodając niczego do znacznie wcześniejszych poprzednich odpowiedzi. Proszę nie dodawać takiego powielającego się bałaganu (uzyskaj przedstawiciel w inny, uzasadniony sposób).
cellepo
-1

Poza tym, że UTF jest nadzbiorem ASCII, kolejna dobra różnica między ASCII a UTF polega na kodowaniu plików dyskowych oraz reprezentacji danych i przechowywaniu w pamięci losowej. Programy wiedzą, że dane należy rozumieć jako ciąg ASCII lub UTF, albo wykrywając specjalne kody znaczników kolejności bajtów na początku danych, albo zakładając z intencji programisty, że dane są tekstem, a następnie sprawdzając je pod kątem wzorców wskazujących, że jest to w jednym lub innym kodowaniu tekstu.

Korzystanie z konwencjonalną notację prefiksu 0xdla danych szesnastkowych, podstawowe odniesienie dobre jest to, że zaczyna tekstowych ASCII o wartościach bajtowych 0x00do 0x7Freprezentującą jedną z możliwych wartości ASCII . Tekst UTF jest zwykle wskazywany przez rozpoczęcie od bajtów 0xEF 0xBB 0xBFdla UTF8. W przypadku UTF16 bajty początkowe 0xFE 0xFFlub 0xFF 0xFEsą używane w kolejności bajtów tekstowych wskazanej przez kolejność bajtów początkowych. Prosta obecność wartości bajtów, które nie znajdują się w zakresie możliwych wartości bajtów ASCII, również wskazuje, że dane to prawdopodobnie UTF.

Istnieją inne znaki kolejności bajtów, które używają różnych kodów, aby wskazać, że dane powinny być interpretowane jako tekst zakodowany w określonym standardzie kodowania.

stackuser83
źródło