Wszystkie znaki w ASCII mogą być kodowane za pomocą UTF-8 bez zwiększania pamięci (oba wymagają bajtu pamięci).
UTF-8 ma dodatkową zaletę obsługi postaci poza „znakami ASCII”. Jeśli tak, to dlaczego kiedykolwiek wybieramy kodowanie ASCII zamiast UTF-8?
Czy istnieje przypadek użycia, w którym wybieramy ASCII zamiast UTF-8?
character-encoding
utf-8
ascii
Pacerier
źródło
źródło
Odpowiedzi:
W niektórych przypadkach może to przyspieszyć dostęp do poszczególnych postaci. Wyobraź sobie łańcuch
str='ABC'
zakodowany w UTF8 i ASCII (i zakładając, że język / kompilator / baza danych wie o kodowaniu)Aby uzyskać dostęp do trzeciego
C
znaku ( ) z tego ciągu za pomocą operatora dostępu do tablicy, który występuje w wielu językach programowania, zrobiłbyś coś takiegoc = str[2]
.Teraz, jeśli ciąg jest zakodowany w ASCII, wystarczy pobrać trzeci bajt z ciągu.
Jeśli jednak łańcuch znaków jest zakodowany w UTF-8, musimy najpierw sprawdzić, czy pierwszy znak jest jedno- lub dwubajtowym char, następnie musimy wykonać to samo sprawdzenie drugiego znaku i tylko wtedy możemy uzyskać dostęp do trzeciego znaku. Różnica w wydajności będzie tym większa, im dłuższa będzie struna.
Jest to problem na przykład w niektórych silnikach baz danych, gdzie aby znaleźć początek kolumny umieszczonej „po” VARCHAR zakodowanym w UTF-8, baza danych musi nie tylko sprawdzić, ile znaków jest w polu VARCHAR, ale także jak wiele bajtów, z których korzysta każdy z nich.
źródło
Jeśli zamierzasz używać tylko podzestawu US-ASCII (lub ISO 646) UTF-8, to nie ma żadnej realnej korzyści dla jednego lub drugiego; w rzeczywistości wszystko jest kodowane identycznie.
Jeśli zamierzasz wyjść poza zestaw znaków US-ASCII i używać (na przykład) znaków z akcentami, umlautów itp., Które są używane w typowych językach Europy Zachodniej, to jest różnica - większość z nich może nadal być zakodowany jednym bajtem w ISO 8859, ale będzie wymagał dwóch lub więcej bajtów, gdy jest zakodowany w UTF-8. Są też oczywiście wady: ISO 8859 wymaga użycia pewnych środków poza pasmem, aby określić używane kodowanie, i obsługuje tylko jedenz tych języków jednocześnie. Na przykład możesz zakodować wszystkie znaki alfabetu cyrylicy (rosyjski, białoruski itp.) Przy użyciu tylko jednego bajtu, ale jeśli chcesz / chcesz mieszać je ze znakami francuskimi lub hiszpańskimi (innymi niż te w US-ASCII / Podzbiór ISO 646) nie masz szczęścia - musisz całkowicie zmienić zestawy znaków, aby to zrobić.
ISO 8859 jest naprawdę przydatny tylko dla europejskich alfabetów. Aby obsługiwać większość alfabetów używanych w większości alfabetów chińskich, japońskich, koreańskich, arabskich itp., Musisz użyć zupełnie innego kodowania. Niektóre z nich (np. Shift JIS w języku japońskim) są absolutnym bólem. Jeśli jest jakaś szansa, że kiedykolwiek będziesz chciał je wesprzeć, uważam, że warto na wszelki wypadek użyć Unicode.
źródło
ANSI może mieć wiele cech, z których większość to 8-bitowe zestawy znaków w tym względzie (np. Strona kodowa 1252 w systemie Windows).
Być może myślałeś o ASCII, który jest 7-bitowy i jest odpowiednim podzbiorem UTF-8. Oznacza to, że każdy prawidłowy strumień ASCII jest również prawidłowym strumieniem UTF-8.
Jeśli myślisz o 8-bitowych zestawach znaków, jedną bardzo ważną zaletą byłoby to, że wszystkie reprezentowalne znaki mają dokładnie 8 bitów, podczas gdy w UTF-8 mogą mieć do 24 bitów.
źródło
Tak, wciąż istnieją przypadki użycia, w których ASCII ma sens: formaty plików i protokoły sieciowe . W szczególności do zastosowań, w których:
Używając ASCII jako kodowania, unikasz złożoności kodowania wielobajtowego, zachowując co najmniej pewną czytelność dla człowieka.
Kilka przykładów:
IDAT
oznacza „dane obrazu”, aPLTE
oznacza „palety”.Oczywiście musisz uważać, aby dane naprawdę nie były prezentowane użytkownikom końcowym, ponieważ jeśli ostatecznie będą widoczne (jak to miało miejsce w przypadku adresów URL), użytkownicy słusznie oczekują, że te dane będą w języku, który potrafią czytać.
źródło
Po pierwsze: twój tytuł używa / d ANSI, podczas gdy w tekście odwołujesz się do ASCII. Należy pamiętać, że ANSI nie równa się ASCII. ANSI zawiera zestaw ASCII. Ale zestaw ASCII jest ograniczony do pierwszych 128 wartości liczbowych (0–127).
Jeśli wszystkie twoje dane są ograniczone do ASCII (7-bit), nie ma znaczenia, czy używasz UTF-8, ANSI czy ASCII, ponieważ zarówno ANSI, jak i UTF-8 zawierają pełny zestaw ASCII. Innymi słowy: wartości liczbowe od 0 do 127 włącznie reprezentują dokładnie takie same znaki w ASCII, ANSI i UTF-8.
Jeśli potrzebujesz znaków spoza zestawu ASCII, musisz wybrać kodowanie. Możesz użyć ANSI, ale potem napotkasz problemy wszystkich różnych stron kodowych. Utwórz plik na komputerze A i przeczytaj go na komputerze B może / będzie produkować zabawnie wyglądające teksty, jeśli te maszyny są skonfigurowane do korzystania z różnych stron kodowych, proste, ponieważ wartość liczbowa nnn reprezentuje różne znaki na tych stronach kodowych.
To „piekło strony kodowej” jest powodem, dla którego zdefiniowano standard Unicode . UTF-8 to tylko jedno kodowanie tego standardu, jest ich znacznie więcej. Najczęściej stosowany jest UTF-16, ponieważ jest to natywne kodowanie dla systemu Windows.
Jeśli więc potrzebujesz obsługiwać coś poza 128 znakami zestawu ASCII, radzę korzystać z UTF-8 . W ten sposób nie ma to znaczenia i nie musisz się martwić, z jaką stroną kodową użytkownicy skonfigurowali swoje systemy.
źródło