Unicode, Unicode Big Endian czy UTF-8? Jaka jest różnica? Który format jest lepszy?

19

Kiedy próbuję zapisać plik tekstowy z tekstem w języku innym niż angielski w Notatniku, dostaję opcję wyboru między Unicode , Unicode Big Endian i UTF-8 . Jaka jest różnica między tymi formatami?

Zakładając, że nie chcę żadnej kompatybilności wstecznej (ze starszymi wersjami systemu operacyjnego lub aplikacjami) i nie dbam o rozmiar pliku, który z tych formatów jest lepszy?

(Załóżmy, że tekst może być w językach takich jak chiński lub japoński, oprócz innych języków).

Uwaga: Z poniższych odpowiedzi i komentarzy wynika, że ​​w języku lingwistycznym Notatnika Unicode to UTF-16 (Little Endian), Unicode Big Endian to UTF-16 (Big Endian), a UTF-8 jest dobrze UTF-8.

Ashwin Nanjappa
źródło

Odpowiedzi:

19

Dunno. Co jest lepsze: piła czy młot? :-)

Unicode nie jest UTF

W tym artykule jest jednak trochę bardziej odpowiedni temat, o którym mowa:

  • UTF-8 koncentruje się na minimalizowaniu wielkości bajtów do reprezentacji znaków z zestawu ASCII (reprezentacja zmiennej długości: każdy znak jest reprezentowany przez 1 do 4 bajtów, a wszystkie znaki ASCII pasują do 1 bajtu). Jak to ujął Joel:

„Spójrz na te wszystkie zera!”, Powiedzieli, ponieważ byli Amerykanami i patrzyli na angielski tekst, który rzadko używał punktów kodowych powyżej U + 00FF. Byli także liberalnymi hipisami w Kalifornii, którzy chcieli zachować (szydzić). Gdyby byli Teksańczykami, nie mieliby nic przeciwko żłobieniu dwa razy większej liczby bajtów. Ale te kalifornijskie mięczaki nie mogły znieść pomysłu podwojenia ilości miejsca na sznurki

  • UTF-32 koncentruje się na wyczerpaniu i reprezentacji stałej długości, używając 4 bajtów dla wszystkich znaków. Jest to najprostsze tłumaczenie, bezpośrednio mapujące punkt kodowy Unicode na 4 bajty. Oczywiście nie jest to bardzo wydajny rozmiar.

  • UTF-16 to kompromis, który wykorzystuje 2 bajty przez większość czasu, ale rozszerza się do 2 * 2 bajtów na znak, aby reprezentować pewne znaki, te nieuwzględnione w Basic Multilingual Plane (BMP).

Zobacz także Absolutne minimum Każdy programista absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!)

Jason Baker
źródło
4
Problem wynika z faktu, że Unicode jest „kodowaniem”, ale nie w sensie liczenia w bajtach. UTF-8/16/32 to kodowania Unicode, ale sam Unicode jest mapowaniem symboli na liczby. Myślę, że mogliby użyć bardziej unikalnej terminologii, aby uniknąć tego zamieszania.
jerryjvl
4
Niezależnie jednak od OP pytania, istnieje prawdopodobieństwo, że aplikacja oznacza „UTF-16”, gdy mówi „Unicode”.
jerryjvl
3
Nie jestem pewien, czy celem UTF-8 jest „konserwacja”, a nie zgodność wsteczna z ASCII.
Mr. Shiny and New 安 宇
@Johannes: Konsorcjum Unicode postanowiło nigdy nie przypisywać punktów kodowych powyżej U + 10FFFF, ponieważ nie mogą być reprezentowane w UTF-16. Spowodowało to ograniczenie UTF-8 do 4 bajtów.
user46971,
1
„Unicode nie jest UTF” - dla wielu jest WTF;)
mlvljr
4

W przypadku języków europejskich UTF-8 jest mniejszy. W przypadku języków orientalnych różnica nie jest tak wyraźna.

Oba poradzą sobie ze wszystkimi możliwymi znakami Unicode, więc nie powinno to mieć różnicy w kompatybilności.

Mark Ransom
źródło
3

Istnieje więcej kodowań znaków Unicode, niż może się wydawać.

  • UTF 8

    Kodowanie UTF-8 ma zmienną szerokość, od 1 do 4 bajtów, przy czym górne bity każdego bajtu są zarezerwowane jako bity kontrolne. Wiodące bity pierwszego bajtu wskazują całkowitą liczbę bajtów używanych dla tego znaku. Wartość skalarna punktu kodowego znaku jest konkatenacją bitów niekontrolowanych. W tej tabeli xreprezentuje najniższe 8 bitów wartości Unicode, yreprezentuje kolejne 8 wyższych bitów i zreprezentuje bity wyższe niż to.

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE
Brad Gilbert
źródło
1
Istnieje więcej kodowań znaków Unicode niż wymienione. Na przykład UTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 i UTF-18 ... Możesz także użyć dowolnego binarnego schematu kodowania do kodowania danych Unicode. Czytaj więcej Porównanie kodowania Unicode
phuclv
1

„Unicode” jest innym terminem określającym „UTF-16”, który jest kodowaniem zestawu znaków Unicode na szesnaście bitów na znak. UTF-8 koduje go na osiem bitów na znak.

W obu przypadkach każde przepełnienie jest przypisywane do kolejnych 16 lub ośmiu bitów.

John Saunders
źródło
Który z nich jest lepszy?
R. Martinho Fernandes
"to zależy od sytuacji.
John Saunders
Chociaż w przypadku tego konkretnego pytania wydaje się, że „Unicode” rzeczywiście jest ABUSED jako inne określenie „UTF-16”, wcale tak nie jest - patrz odpowiedź Jasona.
Arjan
1
Masz na myśli „na jednostkę kodu”, a nie „na znak”; zarówno UTF-8, jak i UTF-16 mogą używać wielu jednostek kodu do reprezentowania znaku. A „Unicode” i „UTF-16” NIE są tym samym, z wyjątkiem terminologii Microsoft.
user46971,
1

Jedyną prawdziwą zaletą małych plików, takich jak pliki tekstowe, jest wynikowy rozmiar pliku. UTF-8 generuje zwykle mniejsze pliki. Ale różnica ta może być mniej wyraźna w przypadku tekstu chińskiego / japońskiego.

zildjohn01
źródło
Pamiętaj, że istnieje również różnica w przepustowości sieci i zużyciu pamięci.
Jason Baker
1
„UTF-8 generuje zwykle mniejsze pliki”: Nie ogólnie. UTF-8 produkuje mniejsze pliki dla plików ASCII. Jeśli plik składa się tylko z punktów kodowych Unicode powyżej U + 0800, będzie większy w UTF-8 niż w UTF-16.
sleske,
0

Jednym słowem, Unicode to zestaw znaków , podczas gdy Unicode Big Endian i utf-8 to dwa kodowania , które są używane do przechowywania znaków na komputerze jako 01.

thuzhf
źródło
A różnica polega na ...?
David Richerby,