Co by się zepsuło, gdyby locale C było UTF-8 zamiast ASCII?

Ustawienia regionalne C są zdefiniowane do używania zestawu znaków ASCII, a POSIX nie zapewnia sposobu użycia zestawu znaków bez zmiany ustawień regionalnych.

Co by się stało, gdyby zamiast tego kodowanie C zostało przełączone na UTF-8?

Pozytywną stroną byłoby to, że UTF-8 stałby się domyślnym zestawem znaków dla każdego procesu, nawet dla demonów systemowych. Oczywiście byłyby aplikacje, które by się zepsuły, ponieważ zakładały, że C używa 7-bitowego ASCII. Ale czy te aplikacje naprawdę istnieją? W tej chwili wiele napisanych kodów jest do pewnego stopnia świadomych ustawień regionalnych i zestawu znaków. Byłbym zaskoczony, gdyby zobaczył kod, który radzi sobie tylko z 7-bitowymi czystymi danymi wejściowymi i nie można go łatwo dostosować do akceptacji a C. z obsługą UTF-8

Komentarze

  • Ten wątek z 2009 roku omawia potrzebę stosowania ustawień regionalnych C opartych na UTF-8, ale nie rozwiązuje problemu łamania POSIX.
  • FWIW, OpenBSD ma C.UTF-8 locale, a także POSIX.UTF-8.

Odpowiedź

Język C nie jest domyślnym ustawieniem regionalnym. Jest to lokalizacja, która na pewno nie spowoduje żadnego „zaskakującego” zachowania. Szereg poleceń generuje dane wyjściowe w gwarantowanej formie (np. Nagłówki ps lub df, date) w lokalizacji C lub POSIX. W przypadku kodowania (LC_CTYPE) gwarantuje się, że [:alpha:] zawiera tylko litery ASCII i tak dalej. Jeśli ustawienia regionalne C zostały zmodyfikowane, spowodowałoby to nieprawidłowe zachowanie wielu aplikacji. Na przykład, mogą odrzucić dane wejściowe, które są nieprawidłowe UTF-8, zamiast traktować je jako dane binarne.

Jeśli chcesz, aby wszystkie programy w twoim systemie używały UTF-8, ustaw domyślne ustawienia regionalne na UTF-8 . To znaczy wszystkie programy, które manipulują jednym kodowaniem. Niektóre programy obsługują tylko strumienie bajtów i nie dbają o kodowanie. Niektóre programy obsługują wiele kodowań i nie dbają o ustawienia regionalne (na przykład serwer WWW lub klient sieciowy ustawia lub odczytuje kodowanie dla każdego połączenia w nagłówku).

Odpowiedź

Wydaje mi się, że jesteś trochę zdezorientowany. Ustawienie „C locale” to ustawienie regionalne, takie jak inne, które, jak zauważyłeś, jest konwencjonalnie synonimem 7-bitowego ASCII.

Sądzę, że jest wbudowane w bibliotekę C, więc biblioteka ma jakieś rezerwy – nie może być żadnych ustawień regionalnych.

Jednak nie ma to nic wspólnego ze sposobem, w jaki programy zbudowane z kodu C radzą sobie z danymi wejściowymi. Ustawienia regionalne są używane do tłumaczenia danych wejściowych, które są przekazywane do pliku wykonywalnego, którym jeśli ustawienia narodowe systemu to UTF-8, program otrzymuje UTF-8 niezależnie od tego, czy jego źródło zostało napisane w C czy w czymś innym jeszcze. Więc:

Byłbym zaskoczony, widząc kod, który radzi sobie tylko z 7-bitowymi czystymi danymi wejściowymi i nie można go łatwo dostosować do akceptowania UTF-8- włączone C

To naprawdę nie ma sensu. Minimalny fragment standardowego źródła C, który czyta ze standardowego wejścia, otrzymuje strumień bajtów z systemu. Jeśli system używa UTF-8 i wytworzył strumień z jakiegoś sprzętu HID, wtedy ten strumień może zawierać znaki zakodowane w UTF-8. Jeśli pochodzi z innego miejsca (np. Z sieci, pliku), może zawierać cokolwiek, co sprawia, że założenie standardu UTF-8 jest przydatne.

Fakt, że locale C jest znacznie bardziej ograniczonym zestawem znaków niż locale UTF-8, nie jest ze sobą powiązany. Nazywa się to po prostu „lokalizacją C”, ale w rzeczywistości nie ma mniej więcej wspólnego z tworzeniem kodu C niż jakikolwiek inny.

W rzeczywistości można na stałe zakodować znaki UTF-8 do c -strings w źródle. Zakładając, że system jest w UTF-8, te ciągi będą wyglądać poprawnie, gdy zostaną użyte przez wynikowy plik wykonywalny.

Link „Roger Leigh”, który zamieściłeś w komentarzu, który moim zdaniem odnosi się do użycia rozszerzony zestaw (UTF-8) jako locale C w bibliotece C przeznaczonej dla środowiska osadzonego, tak że żadne inne locale nie musi być ładowane, aby system mógł się nimi zająć UTF-8.

Zatem odpowiedź na pytanie „Co by się zepsuło, gdyby locale C było UTF-8 zamiast ASCII?” Brzmi, zgaduję , nic, ale poza środowiskiem osadzonym itp. nie ma takiej potrzeby. Ale jest bardzo prawdopodobne, że w pewnym momencie stanie się to normą dla bibliotek takich jak GNU C (myślę, że równie dobrze może być).

Komentarze

  • Na zachowanie różnych wywołań systemowych wpływa według zestawu znaków języka, na przykład « isupper() nie rozpozna A-umlaut (Ä) jako wielką literę w domyślnych ustawieniach regionalnych C. » (z man7.org/linux/man-pages/ man3 / isprint.3.html ).isprint() to kolejne wywołanie systemowe, na które wpływa również fakt, że C jest zdefiniowane jako tylko ASCII.
  • Tak, (teoretycznie) ma na nie wpływ locale, ale tym językiem jest zwykle UTF-8, niekoniecznie musi to być ' C ' . W GNU ' są pod tym względem zepsute, jednak: gnu.org/software/gnulib/manual/html_node/isupper. html Należy pamiętać, że 100% podstaw systemu uniksowego jest zakodowanych w języku C, więc pomysł, że " C nie ' t uchwyt UTF-8 " jest w porządku, po prostu niepoprawny i oczywiście taki. Gdyby program napisany w C nie radził sobie z UTF-8, nie ' nie byłoby żadnego UTF-8 w systemie . Kropka.
  • Qv. także strona POSIX isupper () pubs.opengroup.org/onlinepubs/9699919799/functions/isupper.html " w bieżącej lokalizacji procesu ", a nie " języku C ". Jest to również zgodne ze standardem ISO, który odnosi się do " w języku C " i " w bieżącej lokalizacji ", zwykle w postaci ", jeśli bieżącą lokalizacją jest język C " itd. Pamiętaj, że jeśli korzystasz z Linuksa, implementacja GNU C ' jest niektóre funkcje ctype są uszkodzone.
  • @gioele Są to funkcje biblioteczne, a nie wywołania systemowe. Wywołania systemowe są wywołaniami jądra i nie mają na nie wpływu ustawienia regionalne: ustawienia regionalne istnieją wyłącznie na poziomie użytkownika.
  • @goldilocks To ' nie jest do końca prawdą, że " 100% podstaw systemu Unix jest zakodowanych w C ". Na pewnym poziomie musisz mieć trochę asemblera lub prawdopodobnie asemblerowego C. Przykłady mogą obejmować program ładujący ładujący (bez literówki), rzeczywisty proces przełączania zadań i kilka innych funkcji niskiego poziomu. Poza tym zgadzam się, że C (lub języki wyższego poziomu) są prawdopodobnie używane w całym kodzie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *