Jaka jest różnica między UTF-8 a Unicode

Słyszałem sprzeczne opinie od ludzi-według Wikipedii, patrz tutaj .

To to samo, prawda? Czy ktoś może to wyjaśnić?

Author: Raedwald, 0000-00-00

10 answers

Rozwiń odpowiedzi, które udzielili inni:

Mamy wiele języków z dużą ilością znaków, które komputery powinny idealnie wyświetlać. Unicode przypisuje każdemu znakowi unikalny numer lub punkt kodu.

Komputery zajmują się takimi liczbami jak bajty... pomijając tu trochę historii i ignorując problemy związane z pamięcią, komputery 8-bitowe traktowałyby 8-bitowy bajt jako największą jednostkę liczbową łatwo reprezentowaną na sprzęcie, Komputery 16-bitowe rozszerzałyby ją do dwóch bajtów, i tak dalej.

Stare kodowanie znaków, takie jak ASCII, pochodzi z ery (pre-) 8-bitowej i próbuje wcisnąć dominujący język w informatyce w tym czasie, tj. angielski, w liczby od 0 do 127 (7 bitów). Z 26 literami w alfabecie, zarówno wielkimi, jak i nie-wielkimi, cyframi i znakami interpunkcyjnymi, to działało całkiem dobrze. ASCII zostało rozszerzone o 8 bit dla innych, nie-angielskich języków, ale dodatkowe 128 liczb/punktów kodu udostępnione przez to rozszerzenie byłoby mapowane do różnych znaków w zależności od wyświetlanego języka. Normy ISO-8859 są najczęstszymi formami tego mapowania; ISO-8859-1 i ISO-8859-15 (znane również jako ISO-Latin-1, latin1 i yes istnieją dwie różne wersje standardu ISO 8859).

Ale to nie wystarczy, gdy chcesz reprezentować znaki z więcej niż jednego języka, więc wkuwanie wszystkich dostępnych znaków w jednym bajcie po prostu nie zadziała.

Istnieją zasadniczo dwa różne rodzaje kodowania: jeden rozszerza zakres wartości dodając więcej bitów. Przykładami takich kodowań są UCS2 (2 bajty = 16 bitów) i UCS4 (4 bajty = 32 bity). Cierpią z natury na ten sam problem, co standary ASCII i ISO-8859, ponieważ ich zakres wartości jest nadal ograniczony, nawet jeśli limit jest znacznie wyższy.

Inny typ kodowania używa zmiennej liczby bajtów na znak, a najbardziej powszechnie znane kodowania do tego są kodowania UTF. Wszystkie kodowania UTF działają w mniej więcej w ten sam sposób: wybierasz rozmiar jednostki, który dla UTF-8 wynosi 8 bitów, dla UTF-16 wynosi 16 bitów, a dla UTF-32 wynosi 32 bity. Standard definiuje kilka z tych bitów jako flagi: jeśli są ustawione, to następna jednostka w sekwencji jednostek ma być uważana za część tego samego znaku. Jeśli nie są ustawione, jednostka ta reprezentuje w pełni jeden znak. Tak więc najczęstsze (angielskie) znaki zajmują tylko jeden bajt w UTF-8( dwa w UTF-16, 4 w UTF-32), ale inne znaki językowe mogą zajmować sześć bajtów lub więcej.

Kodowanie wielobajtowe (powinienem powiedzieć wielobajtowe po powyższym wyjaśnieniu) ma tę zaletę, że jest stosunkowo oszczędne w przestrzeni, ale minusem, że operacje takie jak wyszukiwanie podłańcuchów, porównania itp. wszyscy muszą dekodować znaki do punktów kodu unicode, zanim takie operacje mogą być wykonywane(są jednak pewne skróty).

Zarówno standardy UCS, jak i UTF kodują punkty kodu zdefiniowane w Unicode. Teoretycznie te kodowanie może być używane do kodowania dowolnej liczby ( w zakresie, w jakim kodowanie obsługuje) - ale oczywiście te kodowania zostały wykonane do kodowania punktów kodu Unicode. I to jest twój związek między nimi.

Windows obsługuje tak zwane ciągi "Unicode" jako UTF-16, podczas gdy większość Unixów obecnie domyślnie używa UTF-8. Protokoły komunikacyjne, takie jak HTTP, zazwyczaj działają najlepiej z UTF-8, Ponieważ rozmiar jednostki w UTF-8 jest taki sam jak w ASCII, a większość takich protokołów została zaprojektowana w erze ASCII. Z drugiej strony, UTF-16 daje najlepszą średnią Wydajność przestrzeni/przetwarzania podczas reprezentowania wszystkich żywych języków.

Standard Unicode definiuje mniej punktów kodu niż może być reprezentowany w 32 bitach. Tak więc, dla wszystkich praktycznych celów, UTF - 32 i UCS4 stały się tym samym kodowaniem, ponieważ jest mało prawdopodobne, aby mieć do czynienia ze znakami wielomianowymi w UTF-32.

Mam nadzieję, że to wypełni pewne szczegóły.

 398
Author: 0x499602D2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 03:16:04

"Unicode" jest niestety używany na różne sposoby, w zależności od kontekstu. Jego najbardziej poprawne użycie (IMO) jest jako zakodowany zestaw znaków - tzn. zestaw znaków i odwzorowanie między znakami i liczbami całkowitymi punkty kodu reprezentujące je.

UTF-8{[8] } jest kodowaniem znaków - sposobem konwersji z sekwencji bajtów na sekwencje znaków i odwrotnie. Obejmuje on cały zestaw znaków Unicode. ASCII jest kodowane jako pojedynczy bajt na znak i inne znaki przyjmują więcej bajtów w zależności od ich dokładnego punktu kodu (do 4 bajtów dla wszystkich obecnie zdefiniowanych punktów kodu, tj. do U-0010FFFF, a nawet 4 bajty mogą poradzić sobie z maksymalnie U-001FFFFF).

Gdy "Unicode" jest używany jako nazwa kodowania znaków (np. jako kodowanie.NET .Unicode property) zazwyczaj oznacza UTF-16 , który koduje najczęściej znaki jako dwa bajty. Niektóre Platformy (zwłaszcza. NET i Java) używają UTF-16 jako swoich "natywne" kodowanie znaków. Prowadzi to do problemów, jeśli musisz martwić się o znaki, których nie można zakodować w pojedynczej wartości UTF-16 (są one kodowane jako "pary zastępcze") - ale większość deweloperów nigdy się tym nie martwi, IME.

Niektóre odniesienia do Unicode:

 178
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-11 13:39:45

Pozwolę sobie użyć przykładu do zilustrowania tego tematu:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
Jak na razie nic magicznego, to bardzo proste. Powiedzmy, że zatrzymamy tę postać na naszym twardym dysku. Aby to zrobić, musimy zapisać znak w formacie binarnym. Możemy po prostu przechowywać go jako "01101100 01001001". Zrobione!

Ale chwileczkę, czy '01101100 01001001' to jeden znak czy dwa znaki? Wiedziałeś, że to jedna postać, bo ci mówiłem, ale kiedy komputer ją czyta, nie ma pojęcia. Więc potrzebujemy trochę rodzaj "kodowania", aby powiedzieć komputerowi, aby traktował go jako jeden.

Tutaj wchodzą Zasady 'UTF-8': http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

Zgodnie z powyższą tabelą, jeśli chcemy zapisać ten znak używając formatu 'UTF-8', musimy przedrostek naszego znaku dodać jakieś 'nagłówki'. Nasz Chiński znak ma długość 16 bitów (policz wartość binarną samodzielnie), więc użyjemy formatu w wierszu 3, ponieważ zapewnia wystarczającą spacja:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Zapisanie wyniku w jednej linijce:

11100110 10110001 10001001

To jest wartość UTF-8 (binarna) chińskiego znaku! (potwierdź to sam: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Podsumowanie

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001
 163
Author: Cheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 05:52:52

To nie to samo - UTF-8 jest szczególnym sposobem kodowania Unicode.

Istnieje wiele różnych kodowań, które możesz wybrać w zależności od aplikacji i danych, które zamierzasz użyć. Najczęściej są UTF-8, UTF-16 i UTF-32 s o ile wiem.

 104
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 17:09:23

Unicode definiuje tylko punkty kodu , czyli liczbę reprezentującą znak. Sposób przechowywania tych punktów kodu w pamięci zależy od używanego kodowania . UTF-8 jest jednym ze sposobów kodowania znaków Unicode, m.in.

 56
Author: Martin Cote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 17:14:36

Unicode jest standardem, który definiuje, wraz z ISO/IEC 10646, Universal Character Set (UCS) , który jest supersetem wszystkich istniejących znaków wymaganych do reprezentowania praktycznie wszystkich znanych języków.

Unicode przypisuje nazwę i liczbę (kod znaku lub Kod-Punkt) do każdego znaku w swoim repertuarze.

Kodowanie UTF-8 , jest sposobem na cyfrowe reprezentowanie tych znaków w pamięci komputera. UTF-8 mapuje każdy punkt kodu na Sekwencja oktetów (8-bitowych bajtów)

Dla np.

UCS Character = Unicode Han Character

Kod UCS-punkt = U + 24B62

Kodowanie UTF-8 = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)

 26
Author: nightlytrails,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-27 00:30:49

Unicode jest standardem, który definiuje zestaw znaków ( UCS) i kodowanie (UTF ) do kodowania tego zestawu znaków. Ale ogólnie, Unicode jest referowany do zestawu znaków, a nie do standardu.

Przeczytaj absolutne Minimum każdy programista absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!) i Unicode w 5 minut .

 23
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 17:37:07

Istniejące odpowiedzi wyjaśniają już wiele szczegółów, ale oto bardzo krótka odpowiedź z najbardziej bezpośrednim wyjaśnieniem i przykładem.

Unicode jest standardem , który mapuje znaki na Punkty kodowe.
Każda postać ma unikalny kod (numer identyfikacyjny), który jest liczbą taką jak 9731.

UTF-8 jest kodowanie punktów kodowych.
Aby zapisać wszystkie znaki na dysku (w pliku), UTF-8 dzieli znaki do 4 oktetów ( sekwencje 8-bitowe) - bajtów. UTF-8 jest jednym z kilku kodowań (metod reprezentacji danych). Na przykład w Unicode (dziesiętny) punkt kodowy 9731 reprezentuje bałwana (), który składa się z 3 bajtów w UTF-8: E2 98 83

Oto posortowana lista z przypadkowymi przykładami.

 19
Author: basic6,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:19

1. Unicode

Istnieje wiele znaków na całym świecie, jak"$,&, h,a,t,?,张,1,=,+...".

Potem przychodzi organizacja, która jest poświęcona tym postaciom,

Stworzyli standard o nazwie "Unicode".

Norma wygląda następująco:

  • Utwórz formularz, w którym każda pozycja jest nazywana "punktem kodowym" lub "pozycją kodową".
  • całe pozycje są od U + 0000 do U + 10FFFF;
  • do tej pory niektóre pozycje są wypełnione znaki i inne pozycje są zapisywane lub puste.
  • na przykład pozycja " U + 0024 "jest wypełniona znakiem"$".

PS: oczywiście istnieje inna organizacja o nazwie ISO utrzymująca inny standard - "ISO 10646", prawie taki sam.

2. UTF-8

Jak wyżej, U+0024 jest tylko pozycją, więc nie możemy zapisać "U+0024" w komputerze dla znaku"$".

Musi istnieć metoda kodowania.

Potem pojawiają się metody kodowania, takie jak UTF-8, UTF-16, UTF-32, UCS-2....

W UTF-8 punkt kodowy "U + 0024" jest zakodowany w 00100100.

00100100 jest wartością zapisywaną w komputerze dla"$".

 13
Author: wengeezhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 05:06:04

Sprawdziłem linki w odpowiedzi Gumbo i chciałem wkleić część tych rzeczy tutaj, aby istniały również na Stack Overflow.

"...Niektórzy ludzie są pod błędnym przekonaniem, że Unicode jest po prostu 16-bitowym kodem, gdzie każdy znak ma 16 bitów i dlatego istnieje 65,536 możliwych znaków. To nie jest poprawne. Jest to najpopularniejszy mit o Unicode, więc jeśli tak myślałeś, nie czuj się źle.

W rzeczywistości Unicode ma inny sposób myślenie o postaciach, i trzeba zrozumieć Unicode sposób myślenia o rzeczach lub nic nie będzie miało sensu.

Do tej pory zakładaliśmy, że litera odwzorowuje niektóre bity, które można przechowywać na

 12
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54