Vad skulle bryta om C-lokaliteten var UTF-8 istället för ASCII?

C-localen är definierad för att använda ASCII-teckenuppsättningen och POSIX ger inte ett sätt att använda en teckenuppsättning utan att också ändra språkinställningen.

Vad skulle hända om kodningen av C skulle bytas till UTF-8 istället?

Den positiva sidan skulle vara att UTF-8 skulle bli standardteckenuppsättningen för alla processer, till och med systemdemoner. Uppenbarligen skulle det finnas applikationer som skulle gå sönder eftersom de antar att C använder 7-bitars ASCII. Men existerar dessa applikationer verkligen? Just nu är mycket skriven kod i en viss utsträckning lokal- och teckenuppsatt, jag skulle bli förvånad över att se kod som bara kan hantera 7-bitars ren ingång och inte lätt kan anpassas för att acceptera en UTF-8-aktiverad C.

Kommentarer

  • Denna tråd från 2009 diskuterar behovet av en UTF-8-baserad C-lokal, men hanterar inte problemet med att bryta POSIX.
  • FWIW, OpenBSD har ett C.UTF-8 -land, samt POSIX.UTF-8.

Svar

C-plats är inte standardinställningen. Det är en lokal som garanterat inte orsakar något ”överraskande” beteende. Ett antal kommandon har en garanterad form (t.ex. ps eller df rubriker, date format) i C eller POSIX. För kodningar (LC_CTYPE) är det garanterat att [:alpha:] bara innehåller ASCII-bokstäver och så vidare. Om C -läget ändrades skulle detta kräva att många applikationer misshandlar sig. Till exempel kan de avvisa ingång som är ogiltig UTF-8 istället för att behandla den som binär data.

Om du vill att alla program i ditt system ska använda UTF-8, ställer du in standardinställningen för UTF-8. . Alla program som manipulerar en enda kodning, det vill säga. Vissa program manipulerar bara byte-strömmar och bryr sig inte om kodningar. Vissa program manipulerar flera kodningar och bryr sig inte om platsen (till exempel en webbserver eller webbklient ställer in eller läser kodningen för varje anslutning i en rubrik).

Svar

Du är lite förvirrad, tror jag. ”C locale” är ett språk som alla andra, som, som ni påpekar, vanligtvis är en synonym för 7-bitars ASCII.

Det är inbyggt i C-biblioteket, antar jag så att biblioteket har någon form av reserv – det kan inte finnas något språk.

Detta har dock inget att göra med hur program byggda från C-kod hanterar ingång. Lokalen används för att översätta ingång som överlämnas till en körbar, som om systemets språk är UTF-8, UTF-8 är vad programmet får oavsett om dess källa skrevs i C eller något annan. Så:

Jag skulle bli förvånad över att se kod som bara kan hantera 7-bitars ren ingång och inte lätt kan anpassas för att acceptera en UTF-8- aktiverat C

Det är inte riktigt vettigt. En minimal del av standard C-källa som läser från standardingången tar emot en ström av byte från systemet. Om systemet använder UTF-8 och det producerade strömmen från någon HID-maskinvara, kan den strömmen innehålla UTF-8-kodade tecken. Om den kom från någon annanstans (t.ex. ett nätverk, en fil) kan den innehålla vad som helst, vilket gör antagandet för en UTF-8-standard användbar.

faktumet att C-området är en mycket mer begränsad char-uppsättning än UTF-8-området är inte relaterat. Det kallas bara ”C-platsen”, men det har faktiskt inte mer eller mindre att göra med att komponera C-kod än någon annan.

Du kan faktiskt sätta UTF-8-tecken i kod -strängar i källan. Förutsatt att systemet är UTF-8, kommer dessa strängar att se korrekta ut när de används av den resulterande körbara filen.

Länken ”Roger Leigh” som du postade i en kommentar tror jag hänvisar till med en utökad uppsättning (UTF-8) som C-platsen i ett C-bibliotek avsedd för en inbäddad miljö, så att ingen annan lokal behöver laddas för systemet att hantera UTF-8.

Så svaret på frågan, ”Vad skulle gå sönder om C-området var UTF-8 istället för ASCII?” Är, jag skulle gissa , ingenting, men utanför en inbäddad miljö etc. finns det inte mycket behov av att göra detta. Men mycket troligt kommer det att bli normen någon gång för bibliotek som GNU C (det kan lika gärna vara, tror jag).

Kommentarer

  • Uppförandet av olika syscalls påverkas av lokalens teckenuppsättning, till exempel « isupper() känner inte igen en A-umlaut (Ä) som en stor bokstav i standardläget C. » (från man7.org/linux/man-pages/ man3 / isprint.3.html ).isprint() är en annan syscall som påverkas också av det faktum att C definieras som endast ASCII.
  • Ja, (i teorin) påverkas de av lokal, men det lokala är vanligtvis UTF-8, det är inte nödvändigtvis ' C ' . I GNU bryts de ' i detta avseende dock: gnu.org/software/gnulib/manual/html_node/isupper. html Tänk på att 100% av grunden för ett unix-system är kodade i C, så tanken att " C inte ' t handtag UTF-8 " är bra, helt enkelt felaktigt och uppenbarligen så. Om ett program skrivet i C inte kunde hantera UTF-8, skulle inte ' vara någon UTF-8 på systemet . Period.
  • Kv. även POSIX isupper () sida pubs.opengroup.org/onlinepubs/9699919799/functions/isupper.html " i den aktuella platsen för processen ", inte " C-plats ". Detta finns också i ISO-standarden, som hänvisar till " i C-läget " och " i det aktuella läget ", vanligtvis i formen " om den aktuella platsen är C-plats " , etc. Tänk på igen, om du är på Linux, genomför GNU C ' av några av ctype-funktionerna är trasiga.
  • @gioele Detta är biblioteksfunktioner, inte syscalls. Skysamtal är samtal till kärnan och påverkas inte av språk: platser finns enbart på användarnivå.
  • @goldilocks Det ' är inte riktigt sant att " 100% av grunderna för ett unix-system är kodade i C ". På en viss nivå måste du ganska mycket ha lite monterare, eller möjligen monteringsliknande C. Exempel kan inkludera startladdaren (ingen stavfel), den faktiska processen för uppgiftsbyte och en få andra liknande funktioner på låg nivå. Utöver det håller jag dock med om att C (eller språk på högre nivå) sannolikt används i hela kodbasen.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *