Hva ville ødelagt hvis C-lokaliteten var UTF-8 i stedet for ASCII?

C-lokaliteten er definert til å bruke ASCII-tegnsettet, og POSIX gir ikke en måte å bruke et tegnsett uten å endre lokaliteten også.

Hva ville skje hvis kodingen av C ble byttet til UTF-8 i stedet?

Den positive siden ville være at UTF-8 ville bli standard tegnsett for enhver prosess, til og med systemdemoner. Åpenbart ville det være applikasjoner som ville gå i stykker fordi de antar at C bruker 7-biters ASCII. Men eksisterer disse applikasjonene virkelig? Akkurat nå er mye skrevet kode til en viss grad lokal- og charset-bevisst, jeg vil bli overrasket over å se kode som bare kan takle 7-biters ren inngang og som ikke lett kan tilpasses for å akseptere en UTF-8-aktivert C.

Kommentarer

  • Denne tråden fra 2009 diskuterer behovet for en UTF-8-basert C-lokalitet, men tar ikke opp problemet med å bryte POSIX.
  • FWIW, OpenBSD har et C.UTF-8 -land, samt POSIX.UTF-8.

Svar

C-lokalitet er ikke standardområdet. Det er et sted som garantert ikke vil forårsake «overraskende» oppførsel. Et antall kommandoer har utdata fra en garantert form (f.eks. ps eller df overskrifter, date format) i C eller POSIX sted. For kodinger (LC_CTYPE) er det garantert at [:alpha:] bare inneholder ASCII-bokstavene og så videre. Hvis C -området ble endret, ville dette kalle mange applikasjoner til å oppføre seg feil. For eksempel kan de avvise inngang som er ugyldig UTF-8 i stedet for å behandle den som binære data.

Hvis du vil at alle programmene på systemet skal bruke UTF-8, setter du standardområdet til UTF-8. . Alle programmer som manipulerer en enkelt koding, altså. Noen programmer manipulerer bare byte-strømmer og bryr seg ikke om koding. Noen programmer manipulerer flere kodinger og bryr seg ikke om lokaliteten (for eksempel angir eller leser en webserver eller webklient kodingen for hver tilkobling i en overskrift).

Svar

Du er litt forvirret, tror jeg. «C locale» er et sted som alle andre, som, som du påpeker, er konvensjonelt et synonym for 7-biters ASCII.

Det er innebygd i C-biblioteket, antar jeg at biblioteket har en slags tilbakeslag – det kan ikke være noe sted.

Dette har imidlertid ikke noe å gjøre med hvordan programmer bygget fra C-kode håndterer input. Lokalområdet brukes til å oversette innganger som blir levert til en kjørbar fil, som hvis systemets språk er UTF-8, er UTF-8 det programmet får, uansett om kilden er skrevet i C eller noe ellers. Så:

Jeg vil bli overrasket over å se kode som bare kan håndtere 7-biters ren inngang og som ikke lett kan tilpasses for å godta en UTF-8- aktivert C

Virkelig ikke fornuftig. Et minimalt stykke standard C-kilde som leser fra standardinngang, mottar en strøm av byte fra systemet. Hvis systemet bruker UTF-8 og det produserte strømmen fra noe HID-maskinvare, kan den strømmen inneholde UTF-8-kodede tegn. Hvis den kom fra et annet sted (f.eks. Et nettverk, en fil), kan den inneholde hva som helst, og det er det som gjør antagelsen for en UTF-8-standard nyttig.

det faktum at C-lokaliteten er et mye mer begrenset røyesett enn UTF-8-lokalet, er ikke relatert. Det kalles bare «C-lokaliteten», men faktisk har det ikke mer eller mindre å gjøre med å komponere C-kode enn noen annen.

Du kan faktisk kode UTF-8 tegn i c -strenger i kilden. Forutsatt at systemet er UTF-8, vil disse strengene se riktige ut når de brukes av den resulterende kjørbare filen. utvidet sett (UTF-8) som C-lokaliteten i et C-bibliotek beregnet på et innebygd miljø, slik at ingen andre språk må lastes inn for systemet å håndtere UTF-8.

Så svaret på spørsmålet, «Hva ville ødelagt hvis C-lokaliteten var UTF-8 i stedet for ASCII?» Er, jeg vil gjette ingenting, men utenfor et innebygd miljø osv. er det ikke mye behov for å gjøre dette. Men veldig sannsynlig vil det bli normen på et eller annet tidspunkt for biblioteker som GNU C (det kan like godt være, tror jeg). p>

Kommentarer

  • Oppførselen til forskjellige syscalls er påvirket av lokalsetttegnet, for eksempel « isupper() vil ikke gjenkjenne en A-umlaut (Ä) som en stor bokstav i standard C-lokalitet. » (fra man7.org/linux/man-pages/ man3 / isprint.3.html ).isprint() er en annen syscall som også påvirkes av det faktum at C er definert som bare ASCII.
  • Ja, (i teorien) de er påvirket av lokal, men det lokale er vanligvis UTF-8, det er ikke nødvendigvis ' C ' . I GNU er de ' ødelagte i denne forbindelse, men: gnu.org/software/gnulib/manual/html_node/isupper. html Husk at 100% av det grunnleggende i et unix-system er kodet i C, så ideen om at " C ikke ' t håndtak UTF-8 " er bra, rett og slett feil og åpenbart det. Hvis et program skrevet i C ikke kunne håndtere UTF-8, ville ikke ' ikke være noen UTF-8 på systemet . Periode.
  • Kv. også POSIX isupper () side pubs.opengroup.org/onlinepubs/9699919799/functions/isupper.html " i gjeldende sted for prosessen ", ikke " C-lokaliteten ". Dette er også i ISO-standarden, som refererer til " i C-lokaliteten " og " i gjeldende sted ", vanligvis i form " hvis gjeldende sted er C-lokaliteten " , etc. Husk igjen, hvis du er på Linux, implementerer GNU C ' av noen av ctype-funksjonene er ødelagt.
  • @gioele Dette er biblioteksfunksjoner, ikke syscalls. Skysamtaler er anrop til kjernen og påvirkes ikke av lokaliteter: lokaliteter eksisterer kun på brukernivå.
  • @goldilocks Det ' er ikke helt sant at " 100% av det grunnleggende i et unix-system er kodet i C ". På et eller annet nivå må du ganske mye ha litt montør, eller muligens monteringslignende C. Eksempler kan være boot loader (ingen skrivefeil), selve prosessen med oppgavebytte og en få andre lignende funksjoner på lavt nivå. På toppen av det er jeg imidlertid enig i at C (eller språk på høyere nivå) sannsynligvis brukes i hele kodebasen.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *