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ć?
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.
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.
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:
- Strona internetowa Konsorcjum Unicode , a w szczególności sekcja tutoriale
- artykuł Joela
- mój własny artykuł (zorientowany na. net)
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
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.
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.
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)
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 .
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
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"$".
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