A C területi beállítás az ASCII karakterkészlet használatára van definiálva, a POSIX pedig nem biztosítja a karakterkészlet használatát a területi beállítás megváltoztatása nélkül is.
Mi történne, ha a C kódolását helyette UTF-8-ra cserélnék?
A pozitív oldal az lenne, hogy az UTF-8 minden folyamat, akár a rendszerdémonok alapértelmezett karakterkészletévé válna. Nyilván vannak olyan alkalmazások, amelyek megszakadnak, mert feltételezik, hogy a C 7 bites ASCII-t használ. De valóban léteznek ezek az alkalmazások? Jelenleg sok írott kód bizonyos mértékig területi és karakterkészlet-tudatú, meglepődnék, ha olyan kódot látnék, amely csak képes kezelni a 7 bites tiszta bevitelt, és nem könnyen adaptálható elfogadásra egy UTF-8-kompatibilis C.
Megjegyzések
Válasz
A C területi beállítás nem az alapértelmezett területi beállítás. Ez egy olyan nyelvterület, amely garantáltan nem okoz „meglepő” viselkedést. Számos parancs garantált formátumú kimenettel rendelkezik (pl. ps
vagy df
fejlécek, date
format) a C
vagy POSIX
területi beállításokkal. Kódolásoknál (LC_CTYPE
) garantált, hogy a [:alpha:]
csak az ASCII betűket tartalmazza, és így tovább. Ha a C
területi beállítás módosul, ez sok alkalmazást hibás viselkedésre szólít fel. Például elutasíthatják az érvénytelen UTF-8 bemenetet ahelyett, hogy bináris adatokként kezelnék őket.
Ha azt szeretné, hogy a rendszer összes programja használja az UTF-8-at, állítsa az alapértelmezett területi beállítást UTF-8-ra. . Minden program, amely egyetlen kódolást manipulál, vagyis. Egyes programok csak a bájtfolyamokat manipulálják, és nem érdekelnek a kódolások. Egyes programok több kódolást is kezelnek, és nem érdekelnek a területi beállítások (például egy webszerver vagy webkliens állítja be vagy olvassa el az egyes kapcsolatok kódolását egy fejlécben).
Válasz
Szerintem kissé zavart vagy. A “C locale” olyan területi beállítás, mint bármely más, amely, amint rámutat, hagyományosan a 7 bites ASCII szinonimája.
A C könyvtárba van építve, feltételezem, hogy a a könyvtárnak van valamilyen tartaléka – nem lehet területi beállítás.
Ennek azonban semmi köze ahhoz, hogy a C kódból felépített programok hogyan kezelik az inputot. A területi beállítást arra fordítják, hogy egy bemenetet átadjon egy végrehajtható fájlnak. Ha a rendszer területi beállítása UTF-8, akkor az UTF-8 az, amit a program megkap, függetlenül attól, hogy a forrását C-ben írták-e vagy sem más. Tehát:
Meglepődnék, ha olyan kódot látnék, amely csak 7 bites tiszta bemenettel tud foglalkozni, és nem könnyen adaptálható egy UTF-8- engedélyezve C
Nincs igazán értelme. Egy minimális darab standard C forrás, amely beolvassa a standard bemenetet, bájtfolyamot kap a rendszertől. Ha a rendszer UTF-8-at használ, és valamilyen HID hardverből állította elő az adatfolyamot, akkor az az adatfolyam tartalmazhat UTF-8 kódolású karaktereket. Ha valahonnan máshonnan származik (pl. Hálózatról, fájlról), akkor bármit tartalmazhat, ami miatt hasznos az UTF-8 szabvány feltételezése .
az, hogy a C területi beállítás sokkal korlátozottabb karakterkészlet, mint az UTF-8 területi beállítás, nem függ össze. Ez csak a “C locale” nevet viseli, de valójában nem kevesebb vagy kevesebb köze van a C kód összeállításához, mint bármely más.
Valójában hardveresen kódolhatja az UTF-8 karaktereket c -stringek a forrásban. Feltételezve, hogy a rendszer UTF-8, ezek a karakterláncok helyesen fognak kinézni, ha a kapott futtatható fájl használja.
A “Roger Leigh” link, amelyet kommentben tettél közzé, véleményem szerint egy kibővített halmaz (UTF-8) mint a C könyvtár egy beágyazott környezetnek szánt C könyvtárában, így nem kell más területi beállítást betölteni ahhoz, hogy a rendszer kezelje UTF-8.
Tehát arra a kérdésre a válasz, hogy “Mi szakadna meg, ha a C területi beállítás UTF-8 lenne az ASCII helyett?”, Azt tippelném , semmi, de a beágyazott környezeten kívül stb. erre nincs sok szükség. De nagyon valószínű, hogy ez egy bizonyos ponton normává válik az olyan könyvtárak számára, mint a GNU C (szerintem az is lehet).
Megjegyzések
- A különböző rendszerhívások viselkedését befolyásolja például a területi karakter karakterkészlete «
isupper()
nem ismeri fel az A-umlaut (Ä) nagybetűként az alapértelmezett C területi beállításokban. » (from man7.org/linux/man-pages/ man3 / isprint.3.html ).Azisprint()
egy másik rendszerhívás, amelyet befolyásol az a tény is, hogy a C csak ASCII-ként van meghatározva. - Igen, (elméletileg) ezeket a területi beállítás, de ez a területi beállítás általában UTF-8, nem feltétlenül ' C ' . A GNU-ban ' ebben a tekintetben megszakadtak: gnu.org/software/gnulib/manual/html_node/isupper. html Ne feledje, hogy az unix rendszer alapjainak 100% -a C-ben van kódolva, ezért az az elképzelés, hogy " C nem ' t UTF-8 fogantyú " jól van, egyszerűen hibás és nyilvánvalóan így van. Ha egy C-ben írt program nem tudna foglalkozni az UTF-8-val, nem lenne ' nem található UTF-8 a rendszeren . Időszak.
- Qv. a POSIX isupper () oldal pubs.opengroup.org/onlinepubs/9699919799/functions/isupper.html " a " folyamat aktuális területi beállításában , nem pedig " a C területi beállításban ". Ez szerepel az ISO szabványban is, amely " -re utal a C területi beállításban " és " az aktuális területi beállításban ", általában " formátumban, ha az aktuális területi beállítás a C területi beállítás " stb. Ne felejtsd el megint, ha linuxot használsz, akkor a GNU C ' s megvalósítását a ctype függvények egy része megszakadt.
- @gioele Ezek könyvtárfunkciók, nem syscall-ok. A rendszerhívások a kernel hívásai, és a lokálisok nem befolyásolják őket: a lokálok pusztán felhasználói szinten léteznek.
- @goldilocks Ez ' s nem egészen igaz, hogy " Az unix rendszer alapjainak 100% -a kódolva van C ". Bizonyos szinten nagyjából rendelkeznie kell egy kis összeállítóval, vagy esetleg összeállításszerű C-vel. Ilyen lehet például a rendszerbetöltő betöltő (nincs elírás), a feladatváltás tényleges folyamata és egy néhány más hasonlóan alacsony szintű szolgáltatás. Ráadásul egyetértek azzal, hogy valószínűleg a C (vagy magasabb szintű nyelveket) használják az egész kódbázisban.
C.UTF-8
területi beállítással rendelkezik, valamintPOSIX.UTF-8
.