EngelsFransSpaans

OnWorks-favicon

perllocale - Online in de cloud

Voer perllocale uit in de gratis hostingprovider van OnWorks via Ubuntu Online, Fedora Online, Windows online emulator of MAC OS online emulator

Dit is de opdracht perllocale die kan worden uitgevoerd in de gratis hostingprovider van OnWorks met behulp van een van onze meerdere gratis online werkstations zoals Ubuntu Online, Fedora Online, Windows online emulator of MAC OS online emulator

PROGRAMMA:

NAAM


perllocale - Perl-landinstellingen (internationalisatie en lokalisatie)

PRODUCTBESCHRIJVING


In het begin was er ASCII, de ‘American Standard Code for Information’
Interchange", wat redelijk goed werkt voor Amerikanen met hun Engelse alfabet en dollar-
uitgedrukte munt. Maar het werkt niet zo goed, zelfs niet voor andere Engelssprekenden
kan verschillende valuta's gebruiken, zoals het Britse pond (als symbool voor die valuta
staat niet in ASCII); en het is hopeloos ontoereikend voor vele van de duizenden mensen in de wereld
andere talen.

Om deze tekortkomingen aan te pakken, werd het concept van locales uitgevonden (formeel de ISO C,
XPG4, POSIX 1.c "lokaal systeem"). En er werden en worden applicaties geschreven die dat gebruiken
het localemechanisme. Bij het indienen van een dergelijke aanvraag wordt rekening gehouden met de
de voorkeuren van gebruikers op dit soort zaken wordt genoemd internationalisering (vaak
afgekort als i18n); Het vertellen van een dergelijke applicatie over een bepaalde reeks voorkeuren is dat wel
bekend als lokalisatie (l10n).

Perl is uitgebreid om het locale systeem te ondersteunen. Dit wordt per applicatie gecontroleerd
door één pragma, één functieaanroep en verschillende omgevingsvariabelen te gebruiken.

Helaas zijn er nogal wat tekortkomingen in het ontwerp (en vaak ook in de
implementaties) van landinstellingen. Unicode is uitgevonden (zie perlunitut voor een inleiding tot
that) gedeeltelijk om deze tekortkomingen in het ontwerp aan te pakken, en tegenwoordig zijn er een aantal
"UTF-8-landinstellingen", gebaseerd op Unicode. Dit zijn landinstellingen waarvan de tekenset Unicode is,
gecodeerd in UTF-8. Vanaf v5.20 ondersteunt Perl de UTF-8-landinstellingen volledig, behalve
sorteren en stringvergelijkingen. (Gebruik hiervoor Unicode::Collate.) Perl gaat door
ondersteunt ook de oude niet-UTF-8-landinstellingen. Er zijn momenteel geen UTF-8-landinstellingen voor
EBCDIC-platforms.

(Unicode creëert ook "CLDR", de "Common Locale Data Repository",
<http://cldr.unicode.org/> die meer soorten informatie bevat dan beschikbaar zijn
het POSIX-landinstellingssysteem. Op het moment dat dit artikel werd geschreven, bestond er nog geen CPAN-module
biedt toegang tot deze XML-gecodeerde gegevens. Veel van de landinstellingen hebben echter de POSIX-
alleen gegevens geëxtraheerd, en zijn beschikbaar als UTF-8-locales op
<http://unicode.org/Public/cldr/latest/>.)

WAT IS A LOKAAL


Een landinstelling is een reeks gegevens die verschillende aspecten beschrijven van de manier waarop verschillende gemeenschappen in de regio leven
wereld categoriseren hun wereld. Deze categorieën zijn onderverdeeld in de volgende typen
(waarvan sommige hier een korte opmerking bevatten):

Categorie "LC_NUMERIC": numerieke opmaak
Dit geeft aan hoe getallen moeten worden opgemaakt voor menselijke leesbaarheid, bijvoorbeeld de
teken dat als decimaalteken wordt gebruikt.

Categorie "LC_MONETARY": Opmaak van geldbedragen

Categorie "LC_TIME": datum-/tijdnotatie

Categorie "LC_MESSAGES": Fout- en andere berichten
Dit wordt door Perl zelf alleen gebruikt voor toegang tot foutmeldingen van het besturingssysteem via $!
en $^E.

Categorie "LC_COLLATE": Sorteren
Dit geeft de volgorde van letters aan voor vergelijking en sortering. In Latijns
alfabetten, bijvoorbeeld "b", volgt doorgaans op "a".

Categorie "LC_CTYPE": Karaktertypes
Dit geeft bijvoorbeeld aan of een teken een hoofdletter is.

Andere categorieën
Sommige platforms hebben andere categorieën, die zich bezighouden met zaken als meeteenheden
en papierformaten. Geen van deze wordt rechtstreeks door Perl gebruikt, maar wel door externe bewerkingen
Perl waarmee samengewerkt wordt, kan deze gebruiken. Zie 'Niet binnen het bereik van 'landinstelling gebruiken'' hieronder.

Meer details over de door Perl gebruikte categorieën vindt u hieronder in "LOCALE CATEGORIEËN".

Samen zorgen deze categorieën ervoor dat één enkel programma kan worden aangepast
op veel verschillende locaties draaien. Maar er zijn tekortkomingen, dus blijf lezen.

VOORBEREIDINGEN TREFFEN TO GEBRUIK LOCAL


Perl zelf (buiten de POSIX-module) gebruikt geen landinstellingen tenzij specifiek gevraagd
naar (maar merk nogmaals op dat Perl kan communiceren met code die deze wel gebruikt). Zelfs als dat zo is
een dergelijk verzoek, allen van het volgende moet waar zijn om goed te kunnen werken:

· Your werkzaam system Dan moet je ondersteuning the lokaal system. Als dat zo is, zou je het moeten vinden
dat de functie "setlocale()" een gedocumenteerd onderdeel is van de C-bibliotheek ervan.

· Definities voor lokaal uit die helpen . Dan moet je be geïnstalleerd. Jij, of jouw systeem
beheerder, moet ervoor zorgen dat dit het geval is. De beschikbare landinstellingen, de
de locatie waar ze worden bewaard en de manier waarop ze worden geïnstalleerd, variëren allemaal
van systeem tot systeem. Sommige systemen bieden slechts een paar vaste landinstellingen, maar niet
laat staan ​​dat er nog meer bij kan. Bij andere kunt u "ingeblikte" landinstellingen toevoegen die door de
systeem leverancier. Bij weer andere kunt u of de systeembeheerder deze definiëren en toevoegen
willekeurige locaties. (Het kan zijn dat u uw leverancier moet vragen om standaardinstellingen voor deze locatie
worden niet bij uw besturingssysteem geleverd.) Lees hiervoor de systeemdocumentatie
verdere verlichting.

· Perl Dan moet je geloofd wie en wat je bent uit die the lokaal system is ondersteund. Als dat zo is, "perl
-V:d_setlocale" zal zeggen dat de waarde voor "d_setlocale" "define" is.

Als u wilt dat een Perl-applicatie uw gegevens op een bepaalde manier verwerkt en presenteert
locale, moet de applicatiecode het pragma "gebruik locale" bevatten (zie "De "use locale"
pragma") waar van toepassing, en at minst een van het volgende moet waar zijn:

1. De locale-bepalend milieu variabelen (Zie "OMGEVING") Dan moet je be correct reeks
up op het moment dat de applicatie wordt gestart, door uzelf of door wie dan ook
uw systeemaccount; of

2. De toepassing Dan moet je reeks haar het te bezitten. lokaal met behulp van de methode die wordt beschreven in "The setlocale
functie".

GEBRUIK MAKEND VAN LOCAL


De "gebruik maken van plaats" pragma
Standaard negeert Perl zelf (buiten de POSIX-module) de huidige landinstelling. De
"use locale"-pragma vertelt Perl dat hij voor sommige bewerkingen de huidige locale moet gebruiken. Beginnend over
v5.16 zijn er optionele parameters voor dit pragma, die hieronder worden beschreven, die welke beperken
De bedrijfsvoering wordt erdoor beïnvloed.

De huidige landinstelling wordt tijdens de uitvoering ingesteld door plaats instellen() hieronder beschreven. Als dat
functie nog niet is aangeroepen tijdens de uitvoering van het programma, de current
locale is die welke werd bepaald door de "OMGEVING" die van kracht was aan het begin van de
programma. Als er geen geldige omgeving is, is de huidige landinstelling ongeacht het systeem
standaard is ingesteld. Op POSIX-systemen is het waarschijnlijk, maar niet noodzakelijkerwijs, dat de "C"
plaats. In Windows wordt de standaard ingesteld via de computer
"Configuratiescherm->Regionale en taalopties" (of het huidige equivalent ervan).

De bewerkingen die worden beïnvloed door de landinstelling zijn:

Niet binnen the omvang of "gebruik maken van plaats"
Alleen bepaalde bewerkingen die van buiten Perl afkomstig zijn, zouden als volgt getroffen moeten worden:

· De huidige landinstelling wordt gebruikt wanneer u buiten Perl gaat met bewerkingen als
systeem() of qx//, als deze bewerkingen landinstellingsgevoelig zijn.

· Ook Perl geeft toegang tot verschillende C-bibliotheekfuncties via de POSIX-module.
Sommige van deze functies worden altijd beïnvloed door de huidige landinstelling. Bijvoorbeeld,
"POSIX::strftime()" gebruikt "LC_TIME"; "POSIX::strtod()" gebruikt "LC_NUMERIC";
"POSIX::strcoll()" en "POSIX::strxfrm()" gebruiken "LC_COLLATE"; en karakter
classificatiefuncties zoals "POSIX::isalnum()" gebruiken "LC_CTYPE". Al deze
functies zullen zich gedragen volgens de huidige onderliggende landinstelling, zelfs als dat zo is
locale wordt niet blootgesteld aan Perl-ruimte.

· XS-modules voor alle categorieën behalve "LC_NUMERIC" krijgen de onderliggende landinstelling, en
vandaar dat alle C-bibliotheekfuncties die ze aanroepen, die onderliggende landinstelling zullen gebruiken. Voor meer
discussie, zie "CAVEATS" in perlxs.

Merk op dat alle C-programma's (inclusief de perl-interpreter, die in C is geschreven)
altijd een onderliggende landinstelling hebben. Die landinstelling is de landinstelling "C", tenzij gewijzigd door a
bellen naar plaats instellen(). Wanneer Perl opstart, verandert het de onderliggende landinstelling in die ene
wat wordt aangegeven door de "OMGEVING". Bij gebruik van de POSIX-module of het schrijven van XS
code, is het belangrijk om in gedachten te houden dat de onderliggende landinstelling iets kan zijn
anders dan "C", zelfs als het programma dit niet expliciet heeft gewijzigd.

Aanhoudend duurt of "gebruik maken van plaats"
Bepaalde Perl-bewerkingen die zijn ingesteld binnen het bereik van een "gebruikslandinstelling" behouden dat
effect, zelfs buiten de reikwijdte. Deze omvatten:

· Het uitvoerformaat van een schrijven() wordt bepaald door een eerdere formaatdeclaratie
("format" in perlfunc), dus of de uitvoer wel of niet wordt beïnvloed door de landinstelling
bepaald door of de "format()" binnen het bereik valt van een "use locale", niet of
de "schrijf()" is.

· Reguliere expressiepatronen kunnen worden gecompileerd met behulp van qr// met daadwerkelijke matching
uitgesteld tot later. Nogmaals, het gaat erom of de compilatie al dan niet binnenin is uitgevoerd
de reikwijdte van "gebruik landinstelling" die het overeenkomstgedrag bepaalt, niet of de overeenkomsten overeenkomen
binnen een dergelijke reikwijdte worden gedaan of niet.

Onder ""gebruik maken van plaats";"
· Alle bovenstaande handelingen

· Formaat verklaringen ("format" in perlfunc) en dus elk daaropvolgend gebruik van "write()".
"LC_NUMERIC".

· stringificatie en uitvoer gebruik "LC_NUMERIC". Deze omvatten de resultaten van
"print()", "printf()", "say()" en "sprintf()".

· De vergelijking exploitanten ("lt", "le", "cmp", "ge" en "gt") gebruiken "LC_COLLATE".
"sort()" wordt ook beïnvloed als het wordt gebruikt zonder een expliciete vergelijkingsfunctie, omdat
het gebruikt standaard "cmp".

Opmerking: "eq" en "ne" worden niet beïnvloed door de locale: ze voeren altijd char voor char uit
vergelijking van hun scalaire operanden. Wat meer is, als "cmp" constateert dat dit het geval is
operanden zijn gelijk volgens de sorteervolgorde gespecificeerd door de stroom
locale, voert het vervolgens een vergelijking per teken uit en keert alleen terug 0
(gelijk) als de operanden char-voor-char identiek zijn. Als je het echt wilt weten
of twee strings - die "eq" en "cmp" als verschillend beschouwen - in zoverre gelijk zijn
als het om sorteren in de landinstelling gaat, zie de discussie in "Categorie
"LC_COLLATE": Sortering".

· Normaal uitdrukkingen en zaak-wijziging functies ("uc()", "lc()", "uceerste()",
en "lcfirst()") gebruiken "LC_CTYPE"

· De variabelen $! (en zijn synoniemen $ERRNO en $OS_ERROR) en $^E (en zijn synoniem)
$EXTENDED_OS_ERROR) wanneer gebruikt als tekenreeks, gebruik dan "LC_MESSAGES".

Het standaardgedrag wordt hersteld met het pragma "geen landinstelling", of bij het bereiken van het einde van
het blok dat "gebruik locale" omsluit. Houd er rekening mee dat "use locale"-aanroepen genest kunnen zijn, en dat
wat feitelijk binnen een binnenste reikwijdte valt, zal uiteindelijk terugkeren naar de regels van de buitenste reikwijdte
van de binnenruimte.

Het tekenreeksresultaat van elke bewerking die landinstellingen gebruikt, is zoals het is besmet
mogelijk dat een land onbetrouwbaar is. Zie "VEILIGHEID".

Vanaf Perl v5.16 is dat in zeer beperkte mate mogelijk, en meer in het algemeen vanaf v5.22
beperken welke categorie of categorieën worden ingeschakeld door dit specifieke exemplaar van de
pragma door er parameters aan toe te voegen. Bijvoorbeeld,

gebruik locale qw(:ctype :numeriek);

maakt lokaal bewustzijn mogelijk binnen de reikwijdte van alleen die bewerkingen (hierboven vermeld) die dat wel zijn
beïnvloed door "LC_CTYPE" en "LC_NUMERIC".

De mogelijke categorieën zijn: ":collate", ":ctype", ":messages", ":monetary", ":numeric",
":time", en de pseudocategorie ":characters" (hieronder beschreven).

Zo kun je zeggen

gebruik landinstelling ':berichten';

en slechts $! en $^E zal zich bewust zijn van de lokale locatie. Al het andere wordt niet beïnvloed.

Omdat Perl momenteel niets doet met de categorie "LC_MONETARY", specificeert
":monetair" doet feitelijk niets. Sommige systemen hebben andere categorieën, zoals
"LC_PAPER_SIZE", maar Perl weet er ook niets van, en dat is ook niet mogelijk
specificeer ze in de argumenten van dit pragma.

Je kunt ook eenvoudig zeggen dat je alle categorieën op één na moet gebruiken, bijvoorbeeld door:

gebruik landinstelling ':!ctype';
gebruik landinstelling ':not_ctype';

beide betekenen dat de locale-kennis van alle categorieën behalve "LC_CTYPE" moet worden ingeschakeld. Maar een
het categorieargument kan worden opgegeven in een "use locale" als het de genegeerde vorm heeft.

Vóór v5.22 was er slechts één vorm van het pragma met argumenten beschikbaar:

gebruik locale ':not_characters';

(en je moet "not_" zeggen; je kunt de bang "!"-vorm niet gebruiken). Deze pseudocategorie is a
afkorting voor het specificeren van zowel ":collate" als ":ctype". Daarom is het in de ontkende vorm wel zo
bijna hetzelfde als zeggen

gebruik locale qw(:messages :monetary :numeriek :time);

We gebruiken de term "bijna", omdat ":not_characters" ook wordt ingeschakeld
"gebruik de functie 'unicode_strings'" binnen het bereik ervan. Dit formulier is minder nuttig in v5.20 en
later, en wordt volledig beschreven in "Unicode en UTF-8", maar kort gezegd vertelt het Perl dat niet te doen
gebruik de tekengedeelten van de locale-definitie, dat wil zeggen de "LC_CTYPE" en
'LC_COLLATE'-categorieën. In plaats daarvan zal het de eigen tekenset gebruiken (uitgebreid met
Unicode). Wanneer u deze parameter gebruikt, bent u verantwoordelijk voor het verkrijgen van het externe
tekenset vertaald naar de native/Unicode-tekenset (wat het al zal zijn als dat zo is
een van de steeds populairder wordende UTF-8-locaties). Er zijn handige manieren om dit te doen,
zoals beschreven in "Unicode en UTF-8".

De plaats instellen functie
U kunt tijdens runtime zo vaak als u wilt van landinstelling wisselen met "POSIX::setlocale()"
functie:

# Importeer de toolset voor landinstelling uit de POSIX-module.
# Dit voorbeeld gebruikt: setlocale -- de functieaanroep
# LC_CTYPE -- hieronder uitgelegd
# (Het testen op succes/mislukking van bewerkingen tonen is
# weggelaten in deze voorbeelden om afleiding van de hoofdlijnen te voorkomen
# punt)

gebruik POSIX qw(locale_h);
gebruik landinstelling;
mijn $oude_landinstelling;

# query en sla de oude landinstelling op
$oude_locale = setlocale(LC_CTYPE);

setlocale(LC_CTYPE, "fr_CA.ISO8859-1");
# LC_CTYPE nu in locale "Frans, Canada, codeset ISO 8859-1"

setlocale(LC_CTYPE, "");
# LC_CTYPE is nu gereset naar de standaard gedefinieerd door de
# LC_ALL/LC_CTYPE/LANG omgevingsvariabelen, of naar het systeem
# standaard. Zie hieronder voor documentatie.

# herstel de oude landinstelling
setlocale(LC_CTYPE, $oude_locale);

Dit heeft tegelijkertijd invloed op alle threads van het programma, dus het kan problematisch zijn om te gebruiken
landinstellingen in threadtoepassingen, behalve wanneer er één landinstelling is die op alle toepassingen van toepassing is
threads.

Het eerste argument van "setlocale()" geeft de categorie, de tweede de lokaal. De
categorie geeft aan op welk aspect van de gegevensverwerking u landspecifieke regels wilt toepassen.
Categorienamen worden besproken in "LOCALE CATEGORIEËN" en "OMGEVING". De locatie is de
naam van een verzameling aanpassingsinformatie die overeenkomt met een bepaald gegeven
combinatie van taal, land of gebied en codeset. Lees verder voor tips over de
benoemen van landinstellingen: niet alle systemen noemen landinstellingen zoals in het voorbeeld.

Als er geen tweede argument wordt opgegeven en de categorie iets anders is dan "LC_ALL", wordt de
functie retourneert een tekenreeks die de huidige landinstelling voor de categorie noemt. Je kunt dit gebruiken
waarde als het tweede argument in een volgende aanroep van "setlocale()", maar op sommige platforms
de string is ondoorzichtig, niet iets waarvan de meeste mensen zouden kunnen ontcijferen wat
landinstelling betekent.

Als er geen tweede argument wordt opgegeven en de categorie "LC_ALL" is, is het resultaat dat
implementatie-afhankelijk. Het kan een reeks aaneengeschakelde landinstellingen zijn (ook een scheidingsteken
implementatieafhankelijk) of een enkele localenaam. Raadpleeg uw plaats instellen(3) mens
pagina voor details.

Als er een tweede argument wordt opgegeven dat overeenkomt met een geldige landinstelling, wordt de landinstelling voor de
categorie wordt op die waarde ingesteld en de functie retourneert de nu geldende localewaarde. Jij
kan dit vervolgens gebruiken in nog een andere aanroep naar "setlocale()". (In sommige implementaties is de
De geretourneerde waarde kan soms verschillen van de waarde die u als tweede argument hebt opgegeven (denk aan).
het als een alias voor de waarde die u heeft opgegeven.)

Zoals het voorbeeld laat zien, geldt dat als het tweede argument een lege tekenreeks is, de landinstelling van de categorie dat ook is
terug naar de standaardwaarde die is opgegeven door de overeenkomstige omgevingsvariabelen. Over het algemeen,
dit resulteert in een terugkeer naar de standaard die van kracht was toen Perl opstartte: wijzigingen in
de omgeving die door de applicatie na het opstarten wordt gemaakt, kan afhankelijk van de situatie wel of niet worden opgemerkt
in de C-bibliotheek van uw systeem.

Houd er rekening mee dat wanneer een vorm van 'gebruik landinstelling' wordt opgegeven die niet alle categorieën omvat,
Perl negeert de uitgesloten categorieën.

Als "set_locale()" om de een of andere reden mislukt (bijvoorbeeld een poging om een ​​locale
onbekend voor het systeem), de landinstelling voor de categorie wordt niet gewijzigd en de functie
retourneert "undef".

Voor meer informatie over de categorieën, raadpleeg plaats instellen(3).

Het vinden van lokaal
Raadpleeg ook de landinstellingen die beschikbaar zijn in uw systeem plaats instellen(3) om te zien of dit leidt tot
de lijst met beschikbare landinstellingen (zoek naar de ONTDEK OOK sectie). Als dat niet lukt, probeer dan de
volgende opdrachtregels:

locale -a

nlsinfo

ls /usr/lib/nls/loc

ls /usr/lib/lokaal

ls /usr/lib/nls

ls /usr/delen/locale

en kijk of ze iets vermelden dat hierop lijkt

en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
nl_US.iso88591 de_DE.iso88591 ru_RU.iso88595
nl_US de_DE ru_RU
en de ru
Engels Duits Russisch
engels.iso88591 duits.iso88591 russisch.iso88595
engels.roman8 russisch.koi8r

Helaas, ook al is de aanroepinterface voor "setlocale()" gestandaardiseerd, zijn de namen van
landinstellingen en de mappen waarin de configuratie zich bevindt, zijn niet aanwezig. De basisvorm
van de naam is taal_territorium.codeset, maar de laatste delen daarna taal niet
altijd aanwezig. De taal en Land zijn meestal van de standaarden ISO 3166 en ISO
639, de afkortingen van twee letters voor de landen en talen van de wereld,
respectievelijk. De codeset een deel vermeldt er vaak enkele ISO 8859 tekenset, het Latijn
codesets. ‘ISO 8859-1’ is bijvoorbeeld de zogenaamde ‘West-Europese codeset’ die dat wel kan
worden gebruikt om de meeste West-Europese talen adequaat te coderen. Nogmaals, het zijn er meerdere
manieren om zelfs maar de naam van die ene standaard te schrijven. Jammer genoeg.

Twee speciale locaties verdienen bijzondere vermelding: "C" en "POSIX". Momenteel zijn dit
in feite dezelfde locale: het verschil is voornamelijk dat de eerste wordt gedefinieerd door de
C-standaard, de tweede volgens de POSIX-standaard. Zij definiëren de verzuim lokaal waarin
elk programma start zonder lokale informatie in zijn omgeving. (De
verzuim standaardlandinstelling, als je wilt.) De taal is (Amerikaans) Engels en zijn
tekencodeset ASCII of, zelden, een superset daarvan (zoals de "DEC Multinational
Tekenset (DEC-MCS)"). waarschuwing. De C-landinstelling die door sommige leveranciers wordt geleverd, is mogelijk niet
eigenlijk precies overeenkomen met wat de C-standaard vereist. Pas dus op.

NOTITIE: Niet alle systemen hebben de "POSIX" locale (niet alle systemen zijn POSIX-conform), dus
gebruik "C" als u deze standaardlandinstelling expliciet moet opgeven.

LOKAAL PROBLEMEN
Bij het opstarten van Perl kunt u het volgende waarschuwingsbericht tegenkomen:

perl: waarschuwing: Landinstellingen instellen is mislukt.
perl: waarschuwing: Controleer of uw landinstellingen:
LC_ALL = "En_US",
LANG = (niet ingesteld)
worden ondersteund en op uw systeem geïnstalleerd.
perl: waarschuwing: Terugvallen op de standaardlandinstelling ("C").

Dit betekent dat bij uw landinstelling "LC_ALL" is ingesteld op "En_US" en LANG bestaat, maar dat is het geval
geen waarde. Perl probeerde je te geloven, maar kon het niet. In plaats daarvan gaf Perl het op en viel terug
naar de "C"-landinstelling, de standaardlandinstelling die hoe dan ook zou moeten werken. (Op
Windows probeert het eerst terug te vallen naar de standaardlandinstelling van het systeem.) Dit betekent meestal:
uw landinstellingen waren verkeerd, ze vermelden landinstellingen waar uw systeem nog nooit van heeft gehoord, of
de locale-installatie in uw systeem heeft problemen (sommige systeembestanden zijn bijvoorbeeld
kapot of ontbreekt). Er zijn snelle en tijdelijke oplossingen voor deze problemen
grondigere en duurzamere oplossingen.

Testen voor kapot lokaal
Als u Perl vanaf de broncode bouwt, het Perl-testsuitebestand lib/locale.t kan worden gebruikt
test de landinstellingen op uw systeem. De omgevingsvariabele "PERL_DEBUG_FULL_TEST" instellen
op 1 zorgt ervoor dat gedetailleerde resultaten worden weergegeven. Op Linux zou je bijvoorbeeld kunnen zeggen

PERL_DEBUG_FULL_TEST=1 ./perl -T -Ilib lib/locale.t > locale.log 2>&1

Naast vele andere tests, zal het elke landinstelling die het op uw systeem vindt, testen om te zien of deze aanwezig zijn
voldoen aan de POSIX-standaard. Als er fouten in zitten, wordt er aan het einde een samenvatting weergegeven
van de uitvoer waarvan de locales alle tests hebben doorstaan, en welke niet, en waarom.

Tijdelijk vaststelling van lokaal problemen
De twee snelste oplossingen zijn om Perl te laten zwijgen over eventuele inconsistenties in de landinstellingen
of om Perl uit te voeren onder de standaardlandinstelling "C".

Het gezeur van Perl over locale-problemen kan tot zwijgen worden gebracht door de omgevingsvariabele in te stellen
"PERL_BADLANG" naar "0" of "". Deze methode veegt het probleem eigenlijk gewoon onder het tapijt:
je zegt tegen Perl dat hij zijn mond moet houden, zelfs als Perl ziet dat er iets mis is. Wees niet verrast
als er later iets plaatsafhankelijks zich misdraagt.

Perl kan worden uitgevoerd onder de landinstelling "C" door de omgevingsvariabele "LC_ALL" in te stellen op "C".
Deze methode is misschien wat beschaafder dan de "PERL_BADLANG"-benadering, maar setting
"LC_ALL" (of andere localevariabelen) kan ook andere programma's beïnvloeden, niet alleen Perl. In
vooral externe programma's die vanuit Perl worden uitgevoerd, zullen deze veranderingen zien. Als je het maakt
de nieuwe instellingen zijn permanent (lees verder), alle programma's die je draait zien de wijzigingen. Zien
"ENVIRONMENT" voor de volledige lijst met relevante omgevingsvariabelen en "USING LOCALES" voor
hun effecten in Perl. Effecten in andere programma's zijn gemakkelijk af te leiden. Bijvoorbeeld de
variabele "LC_COLLATE" kan van invloed zijn op uw sorteren programma (of welk programma dan ook
rangschikt "records" alfabetisch in uw systeem heet).

U kunt testen of u deze variabelen tijdelijk wijzigt, en of de nieuwe instellingen dat ook lijken te doen
help, plaats die instellingen in uw shell-opstartbestanden. Raadpleeg uw lokale documentatie
voor de exacte details. Voor Bourne-achtige schelpen (sh, ksh, slaan, zsh):

LC_ALL=nl_US.ISO8859-1
LC_ALL exporteren

Hierbij wordt ervan uitgegaan dat we de landinstelling "en_US.ISO8859-1" hebben gezien met behulp van de hierboven besproken opdrachten.
We besloten om dat te proberen in plaats van de bovenstaande defecte locale "En_US" - en in Cshish-shells
(csh, tcsh)

setenv LC_ALL en_US.ISO8859-1

of als je de "env" -toepassing hebt die je kunt doen (in elke shell)

env LC_ALL=en_US.ISO8859-1 perl ...

Als u niet weet welke shell u heeft, raadpleeg dan uw plaatselijke helpdesk of een gelijkwaardige helpdesk.

blijvend vaststelling van lokaal problemen
Bij de langzamere maar superieure oplossingen kunt u het probleem wellicht zelf oplossen
verkeerde configuratie van uw eigen omgevingsvariabelen. De mis(zing)configuratie van de
De landinstellingen van het hele systeem vereisen meestal de hulp van uw vriendelijke systeembeheerder.

Zie eerst eerder in dit document over "Landinstellingen zoeken". Dat vertelt hoe je welke kunt vinden
landinstellingen worden echt ondersteund (en nog belangrijker, geïnstalleerd) op uw systeem. In onze
voorbeeldfoutmelding, omgevingsvariabelen die van invloed zijn op de landinstelling worden in de volgorde vermeld
van afnemend belang (en niet-ingestelde variabelen doen er niet toe). Daarom hebben we LC_ALL
ingesteld op "En_US" moet een slechte keuze zijn geweest, zoals blijkt uit de foutmelding. Eerste poging
het repareren van de landinstellingen die als eerste worden vermeld.

Ten tweede, als je de genoemde commando's gebruikt, zie je iets precies (voorvoegselovereenkomsten niet
count en case meestal mee) zoals "En_US" zonder de aanhalingstekens, dan zou het goed moeten zijn
omdat u een landinstellingsnaam gebruikt die geïnstalleerd en beschikbaar zou moeten zijn in uw systeem.
Zie in dit geval "De landinstellingen van uw systeem permanent herstellen".

blijvend vaststelling van jouw het systeem van lokaal configuratie
Dit is wanneer je zoiets ziet als:

perl: waarschuwing: Controleer of uw landinstellingen:
LC_ALL = "En_US",
LANG = (niet ingesteld)
worden ondersteund en op uw systeem geïnstalleerd.

maar kan dan die "En_US" niet zien in de bovengenoemde opdrachten. Misschien zie je het
dingen als "en_US.ISO8859-1", maar dat is niet hetzelfde. Probeer in dit geval onder a te rennen
locale die u kunt vermelden en die op de een of andere manier overeenkomt met wat u hebt geprobeerd. De regels voor het matchen
localenamen zijn een beetje vaag omdat de standaardisatie op dit gebied zwak is. Zie nogmaals de
"Landinstellingen zoeken" over algemene regels.

Bevestiging system lokaal configuratie
Neem contact op met een systeembeheerder (bij voorkeur uw eigen) en rapporteer de exacte foutmelding
u krijgt, en vraag hen om dezelfde documentatie te lezen die u nu aan het lezen bent. Ze zouden moeten zijn
in staat zijn om te controleren of er iets mis is met de locale-configuratie van de
systeem. Het gedeelte "Landinstellingen zoeken" is helaas een beetje vaag over de exacte locatie
commando's en plaatsen omdat deze dingen niet zo gestandaardiseerd zijn.

De lokaleconv functie
Met de functie "POSIX::localeconv()" kunt u details verkrijgen over de locale-afhankelijke
numerieke opmaakinformatie gespecificeerd door de huidige onderliggende "LC_NUMERIC" en
"LC_MONETARY" landinstellingen (ongeacht of deze wordt aangeroepen vanuit het bereik van "gebruik landinstelling"
of niet). (Als u alleen de naam van de huidige landinstelling voor een bepaalde categorie wilt, gebruikt u
"POSIX::setlocale()" met een enkele parameter - zie "De setlocale-functie".)

gebruik POSIX qw(locale_h);

# Ontvang een verwijzing naar een hash van landafhankelijke informatie
$locale_values ​​= localeconv();

# Voer een gesorteerde lijst met waarden uit
voor (sorteersleutels %$locale_values) {
printf "%-20s = %s\n", $_, $locale_values->{$_}
}

"localeconv()" accepteert geen argumenten en retourneert a referentie naar een hasj. De sleutels hiervan
hash zijn namen van variabelen voor de opmaak, zoals "decimaal_punt" en "duizenden_sep". De
waarden zijn de overeenkomstige, eh, waarden. Zie "localeconv" in POSIX voor een langer voorbeeld
het opsommen van de categorieën die een implementatie naar verwachting zal bieden; sommige bieden meer
en anderen minder. Je hebt geen expliciete "use locale" nodig, omdat "localeconv()" altijd is
observeert de huidige locatie.

Hier is een eenvoudig voorbeeldprogramma dat de opdrachtregelparameters herschrijft als
gehele getallen correct opgemaakt in de huidige landinstelling:

gebruik POSIX qw(locale_h);

# Haal enkele numerieke opmaakparameters van de landinstelling op
mijn ($duizenden_sep, $grouping) =
@{localeconv()}{'duizenden_sep', 'groeperen'};

# Pas standaardwaarden toe als waarden ontbreken
$thousands_sep = ',' tenzij $thousands_sep;

# grouping en mon_grouping zijn ingepakte lijsten
Aantal kleine gehele getallen (tekens) die het vertellen
# groepering (duizend_seps en maand_duizend_seps
# zijn de groepsverdelers) van getallen en
# monetaire hoeveelheden. De betekenissen van de gehele getallen:
# 255 betekent geen groepering meer, 0 betekent herhaling
# de vorige groepering, 1-254 betekent dat je dat moet gebruiken
# als de huidige groepering. Groeperen gaat van
# van rechts naar links (lage naar hoge cijfers). In de
#hieronder spelen we een beetje vals door nooit iets te gebruiken
# anders dan de eerste groepering (wat dat ook is).
if ($groepering) {
@grouping = uitpakken("C*", $grouping);
} Else {
@groepering = (3);
}

# Formatteer opdrachtregelparameters voor de huidige landinstelling
voor (@ARGV) {
$_ = int; # Hak een niet-geheel deel af
1 terwijl
s/(\d)(\d{$grouping[0]}($|$duizenden_sep))/$1$duizenden_sep$2/;
druk "$_" af;
}
druk "\n" af;

Houd er rekening mee dat als het platform "LC_NUMERIC" en/of "LC_MONETARY" niet beschikbaar heeft of
ingeschakeld, zullen de overeenkomstige elementen van de hash ontbreken.

I18N::Taalinfo
Een andere interface voor het opvragen van landafhankelijke informatie is de
"I18N::Langinfo::langinfo()"-functie, tenminste beschikbaar in Unix-achtige systemen en VMS.

In het volgende voorbeeld wordt de functie "langinfo()" zelf en drie constanten geïmporteerd
worden gebruikt als argumenten voor "langinfo()": een constante voor de verkorte eerste dag van de week
(de nummering begint vanaf zondag = 1) en nog twee constanten voor de bevestigende en
negatieve antwoorden op een ja/nee-vraag in de huidige landinstelling.

gebruik I18N::Taalinfo qw(langinfo ABDAY_1 YESSTR NOSTR);

mijn ($abday_1, $yesstr, $nostr)
= kaart { langinfo } qw(ABDAY_1 YESSTR NOSTR);

print "$abday_1? [$yesstr/$nostr] ";

Met andere woorden, in de "C" (of Engelse) landinstelling zal het bovenstaande waarschijnlijk iets afdrukken
graag willen:

Zon? [Ja nee]

Zie I18N::Langinfo voor meer informatie.

LOKAAL CATEGORIEËN


In de volgende subsecties worden de basislandinstellingen beschreven. Buiten deze, enkele
combinatiecategorieën maken manipulatie van meer dan één basiscategorie tegelijk mogelijk. Zien
"MILIEU" voor een bespreking hiervan.

Categorie "LC_COLLATE": Vergelijking
In het kader van een "gebruik landinstelling"-formulier dat sortering omvat, kijkt Perl naar de
Omgevingsvariabele "LC_COLLATE" om de opvattingen van de toepassing over sorteren te bepalen
(ordenen) van karakters. 'b' volgt bijvoorbeeld 'a' in Latijnse alfabetten, maar waar wel
'a' en 'aa' horen erbij? En hoewel 'kleur' ​​in het Engels op 'chocolade' volgt, hoe zit het dan met in
traditioneel Spaans?

De volgende vergelijkingen zijn allemaal logisch en u kunt ze allemaal tegenkomen als u "de landinstelling gebruikt".

ABCDE abcde
A a B b C c D d E e
a A b B c C d D e E
abcd ABCDE

Hier is een codefragment om aan te geven welke "woord"-tekens zich in de huidige landinstelling bevinden
locale volgorde:

gebruik landinstelling;
print +(sorteer grep /\w/, kaart { chr } 0..255), "\n";

Vergelijk dit met de karakters die je ziet en hun volgorde als je dat expliciet vermeldt
de landinstelling moet worden genegeerd:

geen landinstelling;
print +(sorteer grep /\w/, kaart { chr } 0..255), "\n";

Deze machine-native sortering (wat u krijgt tenzij "gebruik landinstelling" is verschenen
eerder in hetzelfde blok) moeten worden gebruikt voor het sorteren van onbewerkte binaire gegevens, terwijl de locale-
afhankelijke sortering van het eerste voorbeeld is nuttig voor natuurlijke tekst.

Zoals opgemerkt in "GEBRUIK VAN LOCALES", vergelijkt "cmp" volgens de huidige sorteerlandinstelling wanneer
"use locale" is van kracht, maar valt terug op een vergelijking van teken per teken voor tekenreeksen die
de landinstelling zegt dat ze gelijk zijn. U kunt "POSIX::strcoll()" gebruiken als u dit najaar niet wilt
terug:

gebruik POSIX qw(strcoll);
$equal_in_locale =
!strcoll("spatie en hoofdletters genegeerd", "SpaceAndCaseIgnored");

$equal_in_locale zal waar zijn als de landinstelling van de sortering een woordenboekachtige volgorde specificeert
dat spaties volledig negeert en hoofdletters en kleine letters opvouwt.

Perl ondersteunt momenteel alleen landinstellingen van één byte voor "LC_COLLATE". Dit betekent dat een
De UTF-8-locale geeft u waarschijnlijk alleen maar een machine-native bestelling. Gebruik Unicode::Collate voor
de volledige implementatie van het Unicode Collation-algoritme.

Als u een enkele tekenreeks heeft die u wilt controleren op 'gelijkheid in landinstelling'
van een aantal andere, zou je kunnen denken dat je wat efficiëntie zou kunnen winnen door het gebruik ervan
"POSIX::strxfrm()" in combinatie met "eq":

gebruik POSIX qw(strxfrm);
$xfrm_string = strxfrm("Tekenreeks met gemengde hoofdletters");
print "landelijke sortering negeert spaties\n"
if $xfrm_string eq strxfrm("Gemengde casestring");
print "landelijke sortering negeert koppeltekens\n"
if $xfrm_string eq strxfrm("Gemengde tekenreeks");
print "landelijke sortering negeert hoofdletters\n"
if $xfrm_string eq strxfrm("string met gemengde hoofdletters");

"strxfrm()" neemt een string en zet deze om in een getransformeerde string voor gebruik in char-by-char
vergelijkingen met andere getransformeerde strings tijdens het sorteren. "Onder de motorkap", locale-
betrokken Perl-vergelijkingsoperatoren roepen "strxfrm()" aan voor beide operanden en voeren vervolgens een char-by-
char-vergelijking van de getransformeerde strings. Door "strxfrm()" expliciet aan te roepen en a
Bij een niet-landelijke vergelijking probeert het voorbeeld een aantal transformaties op te slaan.
Maar in feite bespaart het niets: Perl-magie (zie "Magische variabelen" in perlguts)
creëert de getransformeerde versie van een string de eerste keer dat deze nodig is in een vergelijking,
bewaart deze versie vervolgens voor het geval deze opnieuw nodig is. Een voorbeeld herschreven het makkelijke
manier met "cmp" werkt ongeveer net zo snel. Het kan ook omgaan met nultekens die zijn ingebed in
snaren; als je "strxfrm()" rechtstreeks aanroept, behandelt het de eerste nul die het vindt als een
terminator. verwacht niet dat de getransformeerde snaren die het produceert draagbaar zijn
systemen - of zelfs van de ene revisie van uw besturingssysteem naar de volgende. Kortom, niet doen
roep "strxfrm()" rechtstreeks aan: laat Perl het voor u doen.

Opmerking: "use locale" wordt in sommige van deze voorbeelden niet weergegeven omdat dit niet nodig is:
"strcoll()" en "strxfrm()" zijn POSIX-functies die gebruik maken van de standaard door het systeem geleverde
"libc"-functies die altijd voldoen aan de huidige "LC_COLLATE"-landinstelling.

Categorie "LC_CTYPE": Karakter Types
In het kader van een "gebruik landinstelling"-formulier dat "LC_CTYPE" bevat, gehoorzaamt Perl de "LC_CTYPE"
lokale instelling. Dit bepaalt het idee van de toepassing over welke karakters er zijn
alfabetisch, numeriek, interpunctie, etc. Dit heeft gevolgen voor de reguliere expressie "\w" van Perl
metanotatie, wat staat voor alfanumerieke tekens, dat wil zeggen alfabetisch, numeriek en
het eigen onderstrepingsteken van het platform. (Raadpleeg perlre voor meer informatie over regulier
expressies.) Dankzij "LC_CTYPE", afhankelijk van uw landinstelling, kunnen tekens zoals
"ae", "`", "ss" en "o" kunnen worden opgevat als "\w"-tekens. Het heeft ook invloed op dingen
zoals "\s", "\D", en de POSIX-tekenklassen, zoals "[[:graph:]]". (Zien
perlrecharclass voor meer informatie over dit alles.)

De landinstelling "LC_CTYPE" biedt ook de kaart die wordt gebruikt bij het translitereren van tekens tussen
kleine en hoofdletters. Dit heeft invloed op de functies voor het in kaart brengen van hoofdletters: "fc()", "lc()",
"lcfirst()", "uc()" en "ucfirst()"; interpolatie van case-mapping met "\F", "\l", "\L",
"\u", of "\U" in tekenreeksen tussen dubbele aanhalingstekens en "s///"-substituties; en gevalsonafhankelijk
Het matchen van reguliere expressiepatronen met behulp van de "i"-modifier.

Ten slotte heeft "LC_CTYPE" invloed op de (verouderde) POSIX-tekenklassetest
functies--"POSIX::isalpha()", "POSIX::islower()", enzovoort. Bijvoorbeeld als u verhuist
van de "C"-landinstelling naar een 7-bits ISO 646-taal, zult u misschien tot uw verbazing merken dat
"|" gaat van de klasse "POSIX::ispunct()" naar "POSIX::isalpha()". Helaas, dit
schept grote problemen voor reguliere expressies. "|" betekent nog steeds afwisseling, ook al is dat zo
komt overeen met "\w". Vanaf v5.22 zal er een waarschuwing verschijnen wanneer een dergelijke landinstelling wordt gewijzigd
naar binnen. Meer details vindt u een aantal paragrafen verderop.

Vanaf v5.20 ondersteunt Perl UTF-8-landinstellingen voor "LC_CTYPE", maar verder alleen Perl
ondersteunt landinstellingen van één byte, zoals de ISO 8859-serie. Dit betekent dat brede karakter
landinstellingen, bijvoorbeeld voor Aziatische talen, worden niet goed ondersteund. (Als het platform dat heeft
de mogelijkheid voor Perl om een ​​dergelijke landinstelling te detecteren, te beginnen in Perl v5.22, zal Perl waarschuwen:
standaard ingeschakeld, met gebruikmaking van de waarschuwingscategorie "landinstelling", telkens wanneer een dergelijke landinstelling wordt gewijzigd
in.) De ondersteuning voor UTF-8-landinstellingen is eigenlijk een superset van POSIX-landinstellingen, omdat dat zo is
echt volledig Unicode-gedrag alsof er helemaal geen "LC_CTYPE"-landinstelling van kracht was (behalve
bederf; zie "VEILIGHEID"). POSIX-landinstellingen, zelfs UTF-8-landinstellingen, missen bepaalde concepten
in Unicode, zoals het idee dat het veranderen van de hoofdlettergebruik van een teken zich zou kunnen uitbreiden tot meer
dan één karakter. Perl in een UTF-8-landinstelling geeft je die uitbreiding. Vóór
v5.20 behandelde Perl op sommige platforms een UTF-8-landinstelling, zoals een ISO 8859-1-versie, bij sommige
beperkingen, en op andere platforms lijkt het meer op de "C"-landinstelling. Voor releases v5.16 en
v5.18, "use locale 'not_characters' kan hiervoor worden gebruikt als oplossing (zie "Unicode
en UTF-8").

Houd er rekening mee dat er nogal wat dingen zijn die niet worden beïnvloed door de huidige landinstelling. Elk
letterlijk karakter is het oorspronkelijke karakter voor het gegeven platform. Daarom betekent 'A' de
teken op codepunt 65 op ASCII-platforms en 193 op EBCDIC. Dat kan wel of niet zo zijn
een 'A' in de huidige landinstelling, als die landinstelling zelfs maar een 'A' heeft. Op dezelfde manier, alle ontsnappingen
reeksen voor bepaalde tekens, "\n" bijvoorbeeld, betekenen altijd de native van het platform
een. Dit betekent bijvoorbeeld dat "\N" in reguliere expressies (elk teken behalve nieuw-
line) werkt op de platformtekenset.

Vanaf v5.22 waarschuwt Perl standaard bij het overschakelen naar een landinstelling die opnieuw wordt gedefinieerd
elk afdrukbaar ASCII-teken (plus "\t" en "\n") in een andere klasse dan verwacht.
Dit gebeurt waarschijnlijk alleen op moderne locaties op EBCDIC-platforms, waar bijvoorbeeld a
CCSID 0037-landinstelling op een CCSID 1047-machine verplaatst "[", maar dit kan gebeuren op ASCII-platforms
met de ISO 646 en andere 7-bits landinstellingen die in wezen verouderd zijn. Er kunnen nog dingen gebeuren
werken, afhankelijk van welke functies van Perl door het programma worden gebruikt. Bijvoorbeeld in de
voorbeeld van bovenaf waar "|" wordt een "\w", en er zijn geen reguliere expressies waar
Als dit ertoe doet, werkt het programma mogelijk nog steeds correct. De waarschuwing vermeldt alle karakters
waarvan zij kan vaststellen dat deze nadelig kan worden beïnvloed.

Opmerking: Een defecte of kwaadaardige 'LC_CTYPE'-landinstelling kan ertoe leiden dat deze duidelijk niet in aanmerking komt
tekens die door uw toepassing als alfanumeriek worden beschouwd. Voor strikte matching
van (alledaagse) ASCII-letters en cijfers - bijvoorbeeld in opdrachtreeksen - landbewust
toepassingen moeten "\w" gebruiken met de modifier "/a" voor reguliere expressies. Zie "VEILIGHEID".

Categorie "LC_NUMERIC": Numerieke opmaak
Na een juiste "POSIX::setlocale()"-aanroep, en binnen het bereik van een "use locale"-formulier
dat numerieke waarden bevat, gehoorzaamt Perl de locale-informatie "LC_NUMERIC", die een
het idee van de toepassing over hoe getallen moeten worden opgemaakt voor menselijke leesbaarheid. In de meeste
implementaties is het enige effect het veranderen van het teken dat voor de decimaal wordt gebruikt
punt--misschien van "." naar ",". De functies zijn zich niet bewust van zulke aardigheden als duizenden
scheiding enzovoort. (Zie "De localeconv-functie" als u om deze dingen geeft.)

gebruik POSIX qw(strtod setlocale LC_NUMERIC);
gebruik landinstelling;

setlocale LC_NUMERIC, "";

$n = 5/2; # Wijs numeriek 2.5 toe aan $n

$a = "$n"; # Lokaalafhankelijke conversie naar string

print "half vijf is $n\n"; # Lokaalafhankelijke uitvoer

printf "half vijf is %g\n", $n; # Lokaalafhankelijke uitvoer

print "DECIMALE PUNT IS KOMMA\n"
als $n == (strtod("2,5"))[0]; # Lokaalafhankelijke conversie

Zie ook I18N::Langinfo en "RADIXCHAR".

Categorie "LC_MONETARY": opmaak of monetair hoeveelheden
De C-standaard definieert de categorie "LC_MONETARY", maar niet een functie die hierdoor wordt beïnvloed
De inhoud. (Degenen met ervaring met normcommissies zullen erkennen dat de
werkgroep besloot zich over deze kwestie te buigen.) Bijgevolg accepteert Perl in wezen nee
er kennis van nemen. Als u "LC_MONETARY" echt wilt gebruiken, kunt u de inhoud ervan opvragen - zie
"De localeconv-functie" - en gebruik de informatie die deze retourneert in uw toepassing
eigen opmaak van valutabedragen. Het is echter mogelijk dat u merkt dat de informatie,
hoe omvangrijk en complex het ook is, het voldoet nog steeds niet helemaal aan uw eisen:
valutaformattering is een harde noot om te kraken.

Zie ook I18N::Langinfo en "CRNCYSTR".

"LC_TIME"
Uitvoer geproduceerd door "POSIX::strftime()", waarmee een opgemaakte, voor mensen leesbare datum/tijd wordt opgebouwd
string, wordt beïnvloed door de huidige landinstelling "LC_TIME". Dus in een Franse omgeving de uitvoer
geproduceerd door het %B-formaatelement (volledige maandnaam) voor de eerste maand van het jaar
wees "janvier". Zo krijgt u een lijst met lange maandnamen in de huidige landinstelling:

gebruik POSIX qw(strftime);
voor (0..11) {
$long_month_name[$_] =
strftime("%B", 0, 0, 0, 1, $_, 96);
}

Opmerking: "use locale" is in dit voorbeeld niet nodig: "strftime()" is een POSIX-functie die
gebruikt de standaard door het systeem geleverde "libc"-functie die altijd de huidige "LC_TIME" volgt
Local.

Zie ook I18N::Taalinfo en "ABDAY_1".."ABDAY_7", "DAY_1".."DAY_7", "ABMON_1".."ABMON_12",
en "ABMON_1".."ABMON_12".

Overige categorieën
De overige landinstellingen worden momenteel niet door Perl zelf gebruikt. Maar let nogmaals op
dat dingen waarmee Perl communiceert deze kunnen gebruiken, inclusief extensies buiten de standaard
Perl-distributie, en door het besturingssysteem en zijn hulpprogramma's. Let daar vooral op
de tekenreekswaarde van $! en de foutmeldingen van externe hulpprogramma's kunnen worden gewijzigd
door "LC_MESSAGES". Als u draagbare foutcodes wilt hebben, gebruikt u "%!". Zie Erno.

VEILIGHEID


Hoewel de belangrijkste discussie over Perl-beveiligingskwesties te vinden is in perlsec, is er een discussie
van de locale-afhandeling van Perl zou onvolledig zijn als het uw aandacht niet zou vestigen op locale-
afhankelijke veiligheidsproblemen. Landinstellingen - vooral op systemen die gebruikers zonder rechten toestaan
om hun eigen locaties te bouwen – zijn onbetrouwbaar. Een kwaadaardige (of gewoon kapotte) landinstelling
kan ervoor zorgen dat een locale-bewuste applicatie onverwachte resultaten oplevert. Hier zijn een paar
mogelijkheden:

· Reguliere expressiecontroles voor veilige bestandsnamen of e-mailadressen met behulp van "\w" kunnen dat wel zijn
vervalst door een landinstelling "LC_CTYPE" die beweert dat tekens zoals ">" en "|" Zijn
alfanumeriek.

· Tekenreeksinterpolatie met case-mapping, zoals in bijvoorbeeld "$dest = "C:\U$name.$ext"", mag
gevaarlijke resultaten opleveren als een valse "LC_CTYPE" case-toewijzingstabel van kracht is.

· Een stiekeme "LC_COLLATE"-landinstelling kan resulteren in de namen van studenten met een "D"-cijfer
verschijnen vóór degenen met "A" s.

· Een toepassing die de moeite neemt om informatie in "LC_MONETARY" te gebruiken, kan formatteren
afschrijvingen alsof het tegoeden zijn en vice versa als die landinstelling is ondermijnd. Of
het zou betalingen kunnen doen in Amerikaanse dollars in plaats van in Hongkongse dollars.

· De datum- en dagnamen in datums die zijn opgemaakt door "strftime()" kunnen worden gemanipuleerd
voordeel van een kwaadwillende gebruiker die de landinstelling "LC_DATE" kan ondermijnen. ("Kijk, er staat ik
was zondag niet in het gebouw.")

Dergelijke gevaren zijn niet eigen aan het locale systeem: elk aspect van een applicatie
omgeving die kwaadwillig kan worden gewijzigd, brengt soortgelijke uitdagingen met zich mee. Op dezelfde manier,
ze zijn niet specifiek voor Perl: elke programmeertaal waarmee je programma's kunt schrijven
die rekening houden met hun omgeving stelt u bloot aan deze problemen.

Perl kan u niet beschermen tegen alle mogelijkheden die in de voorbeelden worden getoond; dat is er niet
vervanging van uw eigen waakzaamheid - maar wanneer "use locale" van kracht is, gebruikt Perl de
tainting-mechanisme (zie perlsec) om stringresultaten te markeren die locale-afhankelijk worden, en
die daardoor onbetrouwbaar kunnen zijn. Hier is een samenvatting van het besmettingsgedrag van
operators en functies die kunnen worden beïnvloed door de landinstelling:

· Vergelijk exploitanten ("lt", "le", "ge", "gt" en "cmp"):

Scalaire waar/onwaar (of minder/gelijk/groter) resultaten worden nooit aangetast.

· Casus in kaart brengen interpolatie (met "\l", "\L", "\u", "\U" of "\F")

De resultaatreeks die geïnterpoleerd materiaal bevat, is besmet als de vorm 'gebruik landinstelling' wordt weergegeven
dat "LC_CTYPE" bevat, is van kracht.

· Bijpassende operator ("M//"):

Scalair waar/onwaar resultaat is nooit aangetast.

Alle subpatronen, geleverd als lijstcontextresultaat of als $1 etc., zijn besmet
als een formulier "gebruik locale" dat "LC_CTYPE" bevat van kracht is, en het subpatroon
reguliere expressie bevat een locale-afhankelijke constructie. Deze constructies omvatten
"\w" (om overeen te komen met een alfanumeriek teken), "\W" (niet-alfanumeriek teken), "\b" en
"\B" (woordgrens en niet-grens, afhankelijk van wat "\w" en "\W" overeenkomen), "\s"
(witruimteteken), "\S" (geen witruimteteken), "\d" en "\D" (cijfers en
niet-cijfers) en de POSIX-tekenklassen, zoals "[:alpha:]" (zie "POSIX
Tekenklassen" in perlrecharclass).

Besmetting is ook waarschijnlijk als het patroon hoofdletterongevoelig moet worden gemaakt (via "/i").
De uitzondering is als alle op deze manier te matchen codepunten boven de 255 liggen en dat ook doen
hebben onder Unicode-regels geen plooien tot onder de 256. Hiervoor wordt niet bezoedeld
omdat Perl alleen Unicode-regels gebruikt voor dergelijke codepunten, en die regels zijn de
hetzelfde, ongeacht de huidige locale.

De variabelen met overeenkomende patronen, $&, "$`" (pre-match), "$'" (post-match) en $+ (laatste match),
match) zijn ook besmet.

· Vervanging operator ("S///"):

Heeft hetzelfde gedrag als de matchoperator. Ook wordt de linker operand van "=~".
besmet wanneer een "gebruik locale"-formulier dat "LC_CTYPE" bevat van kracht is, indien gewijzigd als
een resultaat van een vervanging op basis van een reguliere expressie-match waarbij een van de betrokken is
dingen die in het vorige item zijn genoemd, of van case-mapping, zoals "\l", "\L", "\u",
"\U" of "\F".

· uitgang opmaak functies ("printf()" en "schrijven()"):

De resultaten worden nooit aangetast, omdat ze anders bijvoorbeeld zelfs via drukwerk worden afgedrukt
"print(1/7)", zou besmet moeten zijn als "use locale" van kracht is.

· Casus in kaart brengen functies ("lc()", "lcfirst()", "uc()", "ucfirst()"):

De resultaten zijn verslechterd als een formulier 'gebruik landinstelling' met daarin 'LC_CTYPE' van kracht is.

· POSIX locale-afhankelijk functies ("localeconv()", "strcoll()", "strftime()",
"strxfrm()"):

De resultaten zijn nooit bezoedeld.

· POSIX karakter klasse testen ("POSIX::isalnum()", "POSIX::isalpha()",
"POSIX::isdigit()", "POSIX::isgraph()", "POSIX::islower()", "POSIX::isprint()",
"POSIX::ispunct()", "POSIX::isspace()", "POSIX::isupper()", "POSIX::isxdigit()"):

Waar/onwaar-resultaten worden nooit aangetast.

Drie voorbeelden illustreren locatieafhankelijke besmetting. Het eerste programma, dat zijn
locale, wordt niet uitgevoerd: een waarde die rechtstreeks van de opdrachtregel wordt gehaald, mag niet worden gebruikt om een ​​naam te geven
uitvoerbestand wanneer kleurcontroles zijn ingeschakeld.

#/usr/local/bin/perl -T
# Uitvoeren met controle op vlekken

# Sanity check op de opdrachtregel weggelaten...
$tainted_output_file = verschuiving;

open(F, ">$tainted_output_file")
of waarschuw "Openen van $tainted_output_file mislukt: $!\n";

Het programma kan worden uitgevoerd door de besmette waarde via een regulier programma te "witwassen".
expressie: het tweede voorbeeld (dat nog steeds de lokale informatie negeert) wordt uitgevoerd en creëert de
bestand genoemd op de opdrachtregel als dat mogelijk is.

#/usr/local/bin/perl -T

$tainted_output_file = verschuiving;
$tainted_output_file =~ m%[\w/]+%;
$untainted_output_file = $&;

open(F, ">$untainted_output_file")
of waarschuw "Openen van $untainted_output_file mislukt: $!\n";

Vergelijk dit met een soortgelijk maar lokaal bewust programma:

#/usr/local/bin/perl -T

$tainted_output_file = verschuiving;
gebruik landinstelling;
$tainted_output_file =~ m%[\w/]+%;
$localized_output_file = $&;

open(F, ">$localized_output_file")
of waarschuw "Openen van $localized_output_file mislukt: $!\n";

Dit derde programma werkt niet omdat $& besmet is: het is het resultaat van een match
waarbij "\w" betrokken is terwijl "gebruik landinstelling" van kracht is.

MILIEU


PERL_SKIP_LOCALE_INIT
Deze omgevingsvariabele, beschikbaar vanaf Perl v5.20, indien ingesteld (op any
value), vertelt Perl dat hij de rest van de omgevingsvariabelen niet mag gebruiken
initialiseren met. In plaats daarvan gebruikt Perl de huidige landinstellingen.
Dit is vooral handig in ingebedde omgevingen, zie "Ingebedde Perl gebruiken
met POSIX-landinstellingen" in perlembed.

PERL_BADLANG
Een tekenreeks die de waarschuwing van Perl over mislukte landinstellingen op kan onderdrukken
beginnen. Er kan een fout optreden als de landinstelling in het besturingssysteem wordt ondersteund
op de een of andere manier ontbreekt (gebroken) - of als u de naam van een landinstelling verkeerd hebt getypt toen u
uw omgeving instellen. Als deze omgevingsvariabele afwezig is, of een
waarde anders dan "0" of "", zal Perl klagen over fouten in de landinstellingen.

NOTITIE: "PERL_BADLANG" geeft u alleen een manier om het waarschuwingsbericht te verbergen. De
bericht vertelt over een probleem in de landinstellingen van uw systeem, en over u
moet onderzoeken wat het probleem is.

DPKG_RUNNING_VERSION
Op Debian-systemen geldt dat als de omgevingsvariabele DPKG_RUNNING_VERSION is ingesteld (to
welke waarde dan ook), worden de waarschuwingen voor landfouten onderdrukt, net als bij a
nul PERL_BADLANG-instelling. Dit wordt gedaan om een ​​stortvloed aan valse waarschuwingen te voorkomen
tijdens systeemupgrades. Zienhttp://bugs.debian.org/508764>.

De volgende omgevingsvariabelen zijn niet specifiek voor Perl: Ze maken deel uit van de
gestandaardiseerde (ISO C, XPG4, POSIX 1.c) "setlocale()"-methode voor het besturen van een
het oordeel van de toepassing over de gegevens. Windows is niet-POSIX, maar Perl regelt het volgende
toch werken zoals beschreven. Als de door een omgevingsvariabele gegeven landinstelling niet geldig is,
Perl probeert de eerstvolgende lagere prioriteit. Als er geen geldig zijn, wordt in Windows het systeem
Vervolgens wordt de standaardlandinstelling geprobeerd. Als al het andere niet lukt, wordt de landinstelling "C" gebruikt. Als zelfs dat
werkt niet, er is iets ernstig kapot, maar Perl probeert door te gaan met wat dan ook
landinstellingen kunnen zijn.

"LC_ALL" "LC_ALL" is de omgevingsvariabele "override-all". Indien ingesteld, is het
overschrijft alle overige omgevingsvariabelen.

"TAAL" NOTITIE: "LANGUAGE" is een GNU-extensie, deze heeft alleen invloed op u als u de
GNU libc. Dit is het geval als u bijvoorbeeld Linux gebruikt. Als u gebruikt
"commerciële" Unixen ben jij hoogstwaarschijnlijk niet gebruik GNU libc en dat kan
negeer "TAAL".

Als u echter "TAAL" gebruikt: dit heeft invloed op de taal van
informatieve, waarschuwings- en foutmeldingen die door opdrachten worden weergegeven (met andere woorden:
het lijkt op "LC_MESSAGES") maar het heeft een hogere prioriteit dan "LC_ALL". Bovendien,
het is niet een enkele waarde, maar in plaats daarvan een "pad" (-gescheiden lijst) van talen
(geen landinstellingen). Zie de GNU "gettext" bibliotheekdocumentatie voor meer informatie
informatie.

"LC_CTYPE" Als "LC_ALL" ontbreekt, kiest "LC_CTYPE" de landinstelling van het tekentype. In
bij afwezigheid van zowel "LC_ALL" als "LC_CTYPE", kiest "LANG" het tekentype
Local.

"LC_COLLATE"
Bij afwezigheid van "LC_ALL", kiest "LC_COLLATE" de sortering (sortering)
plaats. Bij afwezigheid van zowel "LC_ALL" als "LC_COLLATE", kiest "LANG" de
landinstelling van de sortering.

"LC_MONETARIEEL"
Als "LC_ALL" ontbreekt, kiest "LC_MONETARY" de monetaire opmaak
plaats. Bij afwezigheid van zowel "LC_ALL" als "LC_MONETARY", kiest "LANG" de
landinstelling voor monetaire opmaak.

"LC_NUMERIC"
Als "LC_ALL" ontbreekt, kiest "LC_NUMERIC" de landinstelling van het numerieke formaat.
Bij afwezigheid van zowel "LC_ALL" als "LC_NUMERIC", kiest "LANG" het numerieke
formaat.

"LC_TIME" Bij afwezigheid van "LC_ALL", kiest "LC_TIME" de datum- en tijdnotatie
plaats. Bij afwezigheid van zowel "LC_ALL" als "LC_TIME", kiest "LANG" de
landinstelling voor datum- en tijdnotatie.

"LANG" "LANG" is de "catch-all" locale-omgevingsvariabele. Als het is ingesteld, is het dat ook
gebruikt als laatste redmiddel na de algemene "LC_ALL" en de categoriespecifieke
"LC_foo".

Voorbeelden
De "LC_NUMERIC" bestuurt de numerieke uitvoer:

gebruik landinstelling;
gebruik POSIX qw(locale_h); # Importeert setlocale() en de LC_-constanten.
setlocale(LC_NUMERIC, "fr_FR") of die "Pardon";
printf "%g\n", 1.23; # Als de "fr_FR" is gelukt, wordt waarschijnlijk 1,23 weergegeven.

en ook hoe tekenreeksen door "POSIX::strtod()" worden geparseerd als getallen:

gebruik landinstelling;
gebruik POSIX qw(locale_h strtod);
setlocale(LC_NUMERIC, "de_DE") of die "Entschuldigung";
mijn $x = strtod("2,34") + 5;
print $x, "\n"; # Toont waarschijnlijk 7,34.

OPMERKINGEN


Draad "evalueren" en "LC_NUMERIC"
Een string eval ontleedt zijn expressie als standaard Perl. Het verwacht daarom de
decimaalteken een punt is. Als "LC_NUMERIC" zo is ingesteld dat dit een komma is, wordt de
het ontleden zal in de war raken, misschien in stilte.

gebruik landinstelling;
gebruik POSIX qw(locale_h);
setlocale(LC_NUMERIC, "fr_FR") of die "Pardon";
mijn $a = 1.2;
afdrukwaarde "$a + 1.5";
druk "\n" af;

drukt "13,5" af. Dit komt omdat in die landinstelling de komma het decimaalteken is.
De "eval" breidt zich dus uit naar:

evaluatie "1,2 + 1.5"

en het resultaat is niet wat u waarschijnlijk had verwacht. Er worden geen waarschuwingen gegenereerd. Als je dat doet
string "eval" valt binnen het bereik van "use locale", u moet in plaats daarvan de "eval" wijzigen
regel om iets te doen als:

print eval "geen landinstelling; $a + 1.5";

Hiermee wordt 2.7 afgedrukt.

U kunt ook "LC_NUMERIC" uitsluiten, als u dit niet nodig heeft, door

gebruik locale ':!numeriek';

achterwaarts verenigbaarheid
Versies van Perl vóór 5.004 meestal genegeerde lokale informatie en gedraagt ​​zich over het algemeen als
als iets dat lijkt op de "C"-landinstelling altijd van kracht zou zijn, zelfs als het programma
omgeving suggereerde anders (zie "De setlocale-functie"). Standaard is Perl nog steeds
gedraagt ​​zich op deze manier voor achterwaartse compatibiliteit. Als u een Perl-applicatie wilt betalen
aandacht voor lokale informatie, u Dan moet je gebruik het pragma "use locale" (zie "Het "use
locale"pragma") of, in het onwaarschijnlijke geval dat u dit alleen voor een patroon wilt doen
matching, de "/l" modifier voor reguliere expressies (zie "Character set modifiers" in perlre)
om hem daartoe opdracht te geven.

Versies van Perl van 5.002 tot 5.003 gebruikten de "LC_CTYPE"-informatie, indien beschikbaar; Dat
dat wil zeggen: "\w" begreep wat de letters waren volgens de lokale omgeving
variabelen. Het probleem was dat de gebruiker geen controle had over de functie: als de C
door de bibliotheek ondersteunde landinstellingen, gebruikte Perl ze.

I18N: Verzamelen verouderd
In versies van Perl vóór 5.004 was sortering per land mogelijk met behulp van de
Bibliotheekmodule "I18N::Collate". Deze module is nu enigszins verouderd en moet worden vermeden
bij nieuwe toepassingen. De functionaliteit "LC_COLLATE" is nu geïntegreerd in de Perl-kern
taal: Men kan locale-specifieke scalaire gegevens volledig normaal gebruiken met "use locale",
het is dus niet langer nodig om te jongleren met de scalaire referenties van "I18N::Collate".

Sorteer snelheid en geheugen . impacts
Het vergelijken en sorteren op landinstelling is doorgaans langzamer dan de standaardsortering; vertragingen van
twee tot vier keer zijn waargenomen. Het zal ook meer geheugen verbruiken: ooit een Perl
scalaire variabele heeft deelgenomen aan elke tekenreeksvergelijking of sorteerbewerking die voldoet aan de
locale sorteerregels, zal het 3-15 keer meer geheugen in beslag nemen dan voorheen. (De exacte
vermenigvuldiger is afhankelijk van de inhoud van de tekenreeks, het besturingssysteem en de landinstelling.) Deze
De nadelen worden meer bepaald door de implementatie van het locale systeem door het besturingssysteem
dan door Perl.

Vrij Beschikbaar lokaal definities
Het Unicode CLDR-project extraheert het POSIX-gedeelte van veel van zijn landinstellingen, beschikbaar op

http://unicode.org/Public/cldr/latest/

Er is een grote verzameling localedefinities op:

http://std.dkuug.dk/i18n/WG15-collection/locales/

U dient zich ervan bewust te zijn dat het niet wordt ondersteund en dat er niet wordt beweerd dat het voor welk doel dan ook geschikt is.
Als uw systeem de installatie van willekeurige landinstellingen toestaat, kunt u de definities vinden
hoe nuttig ze ook zijn, of als basis voor de ontwikkeling van uw eigen landinstellingen.

ik18n en l10n
"Internationalisering" wordt vaak afgekort als i18n omdat de eerste en laatste letters dat zijn
gescheiden door achttien anderen. (Je raadt misschien wel waarom de internalin... internaliti... i18n
heeft de neiging afgekort te worden.) Op dezelfde manier wordt ‘lokalisatie’ vaak afgekort tot l10n.

An onvolmaakt standaard
Internationalisering, zoals gedefinieerd in de C- en POSIX-standaarden, kan als volgt worden bekritiseerd
onvolledig, onhandig en met een te grote granulariteit. (Lokales zijn van toepassing op een geheel
proces, terwijl het aantoonbaar nuttiger zou zijn om ze op één enkele thread toe te passen,
venstergroep, of wat dan ook.) Ze hebben ook de neiging, net als standaardgroepen, om zich te verdelen
de wereld in naties, terwijl we allemaal weten dat de wereld evengoed in verdeeld kan worden
bankiers, motorrijders, gamers, enzovoort.

Unicode en UTF-8


De ondersteuning van Unicode is nieuw vanaf Perl-versie v5.6 en vollediger geïmplementeerd
in versies v5.8 en hoger. Zie perluniintro.

Vanaf Perl v5.20 worden UTF-8-landinstellingen ondersteund in Perl, behalve "LC_COLLATE" (gebruik
Unicode::Collate in plaats daarvan). Als u Perl v5.16 of v5.18 hebt en niet kunt upgraden, kunt u

gebruik locale ':not_characters';

Wanneer deze vorm van pragma wordt gebruikt, worden alleen de niet-karaktergedeelten van landinstellingen gebruikt
door Perl, bijvoorbeeld "LC_NUMERIC". Perl gaat ervan uit dat u alle
tekens waarmee het moet werken in Unicode (eigenlijk de eigen tekenset van het platform).
(ASCII of EBCDIC) plus Unicode). Voor gegevens in bestanden kan dit ook gemakkelijk worden gedaan
specificeren

gebruik open ':locale';

Dit pragma zorgt ervoor dat alle invoer van bestanden vanuit het
huidige locale zoals gespecificeerd in de omgeving (zie "OMGEVING"), en alle uitgangen naar
bestanden die terug naar de landinstelling moeten worden vertaald. (Zie geopend). Op een per-filehandle-basis kunt u
kan in plaats daarvan de PerlIO::locale module of de Encode::Locale module gebruiken, beide beschikbaar
van CPAN. De laatste module bevat ook methoden om de afhandeling van "ARGV" en
omgevingsvariabelen, en kan op individuele strings worden gebruikt. Als je dat allemaal weet
locales zullen UTF-8 zijn, zoals er tegenwoordig veel zijn, je kunt de -C opdrachtregel schakelaar.

Deze vorm van pragma maakt een in wezen naadloze verwerking van landinstellingen met Unicode mogelijk. De
De sorteervolgorde is volgens Unicode-codepuntvolgorde. Het wordt sterk aanbevolen wanneer
je moet de strings ordenen en sorteren die je gebruikt met de standaardmodule Unicode::Collate
geeft in veel gevallen veel betere resultaten dan met de ouderwetse landinstellingen
behandeling.

Alle zojuist beschreven modules en schakelaars kunnen in v5.20 worden gebruikt met gewoon "use
locale", en als de invoerlandinstellingen niet UTF-8 zijn, krijgt u minder dan ideaal
gedrag, dat hieronder wordt beschreven, dat u krijgt met Perls van vóór v5.16, of wanneer u de landinstelling gebruikt
pragma zonder de parameter ":not_characters" in v5.16 en v5.18. Als u gebruikt
uitsluitend UTF-8-landinstellingen in v5.20 en hoger, hierop is de rest van deze sectie niet van toepassing
je.

Er zijn twee gevallen: multi-byte- en single-byte-landinstellingen. Eerste multibyte:

De enige multi-byte (of brede karakter) locale die Perl waarschijnlijk ooit zal ondersteunen is
UTF-8. Dit komt door de moeilijkheid van de implementatie, het feit dat UTF-8 van hoge kwaliteit is
locales worden nu voor elk deel van de wereld gepubliceerd
(<http://unicode.org/Public/cldr/latest/>), en bij gebrek aan alles wat je kunt gebruiken
Codeermodule om te vertalen naar/van uw landinstelling. Dus je zult een van die dingen moeten doen
als u een van deze landinstellingen gebruikt, zoals Big5 of Shift JIS. Voor UTF-8-landinstellingen, in
Perls (vóór v5.20) die geen volledige UTF-8 locale-ondersteuning hebben, werken mogelijk redelijk goed
(afhankelijk van uw C-bibliotheekimplementatie) simpelweg omdat zowel zij als Perl opslaan
tekens die op dezelfde manier meerdere bytes in beslag nemen. Sommige, zo niet de meeste, C
bibliotheekimplementaties verwerken mogelijk niet de tekens in de bovenste helft van de Latin-1
bereik (128 - 255) correct onder "LC_CTYPE". Om te zien of een personage van een bepaald type is
onder een locale gebruikt Perl de functies zoals "isalnum()". Uw C-bibliotheek werkt mogelijk niet voor
UTF-8-landinstellingen met deze functies, werken in plaats daarvan alleen onder de nieuwere brede bibliotheek
functies zoals "iswalnum()", die Perl niet gebruikt. Deze multi-byte-landinstellingen zijn
behandeld als landinstellingen van één byte, en hebben de hieronder beschreven beperkingen.
Vanaf Perl v5.22 wordt er een waarschuwingsbericht gegenereerd wanneer Perl een landinstelling van meerdere bytes detecteert
dat het niet volledig ondersteunt.

Voor landinstellingen van één byte kiest Perl doorgaans voor het gebruik van landinstellingen voor codepunten
die in een enkele byte passen, en Unicode-regels voor degenen die dat niet kunnen (hoewel dit niet het geval is
gelijkmatig toegepast, zie de opmerking aan het einde van dit hoofdstuk). Dit voorkomt veel problemen
in landinstellingen die niet UTF-8 zijn. Stel dat de landinstelling ISO8859-7 is, Grieks. Het karakter bij
0xD7 is er een hoofdletter Chi. Maar in de ISO8859-1-landinstelling, Latin1, is het een vermenigvuldiging
teken. De POSIX-tekenklasse voor reguliere expressies "[[:alpha:]]" komt op magische wijze overeen
0xD7 in de Griekse landinstelling, maar niet in de Latijnse taal.

Er zijn echter plaatsen waar dit kapot gaat. Bepaalde Perl-constructies zijn voor Unicode
alleen, zoals "\p{Alpha}". Ze gaan ervan uit dat 0xD7 altijd de Unicode-betekenis heeft (of de
equivalent op EBCDIC-platforms). Omdat Latin1 een subset is van Unicode en 0xD7 de
vermenigvuldigingsteken in zowel Latin1 als Unicode, "\p{Alpha}" zal nooit overeenkomen,
ongeacht de locatie. Een soortgelijk probleem treedt op met "\N{...}". Vóór v5.20 was dit het geval
daarom is het een slecht idee om "\p{}" of "\N{}" te gebruiken onder gewoon "gebruik landinstelling"--tenzij je kunt
garanderen dat de landinstelling ISO8859-1 zal zijn. Gebruik in plaats daarvan POSIX-tekenklassen.

Een ander probleem met deze aanpak is dat bewerkingen de enkele byte/meerdere overschrijden
bytegrenzen zijn niet goed gedefinieerd en zijn daarom niet toegestaan. (Deze grens ligt tussen de
codepunten op 255/256.) Bijvoorbeeld onderste hoofdletter LATIJNSE HOOFDLETTER Y MET DIAERESIS
(U+0178) zou LATIJNSE KLEINE LETTER Y MET DIAERESE (U+00FF) moeten retourneren. Maar in het Grieks
locale, er is bijvoorbeeld geen teken op 0xFF, en Perl weet niet wat
het karakter op 0xFF zou eigenlijk moeten vertegenwoordigen. Het verbiedt dus de bewerking.
In deze modus is de kleine letter van U+0178 zichzelf.

Dezelfde problemen ontstaan ​​als u automatische UTF-8-ificatie van uw standaardbestand inschakelt
handvatten, standaardlaag "open()" en @ARGV op niet-ISO8859-1, niet-UTF-8 landinstellingen (door gebruik te maken van
hetzij de -C opdrachtregelschakelaar of de omgevingsvariabele "PERL_UNICODE"; zien
perlrun). Dingen worden ingelezen als UTF-8, wat normaal gesproken een Unicode zou impliceren
interpretatie, maar de aanwezigheid van een locale zorgt ervoor dat ze in die locale worden geïnterpreteerd
in plaats van. Een codepunt 0xD7 in de Unicode-invoer zou bijvoorbeeld de
vermenigvuldigingsteken, zal door Perl niet op die manier worden geïnterpreteerd onder de Griekse landinstelling. Dit
is geen probleem mits u zorgt ervoor dat alle landinstellingen altijd en alleen een van beide zijn
een ISO8859-1, of, als u niet over een gebrekkige C-bibliotheek beschikt, een UTF-8-landinstelling.

Nog een ander probleem is dat deze benadering ertoe kan leiden dat twee codepunten hetzelfde betekenen
karakter. Dus in een Griekse landinstelling zijn zowel U+03A7 als U+00D7 GRIEKSE HOOFDLETTER CHI.

Vanwege al deze problemen zal Perl vanaf v5.22 een waarschuwing geven als er meerdere
byte (vandaar Unicode) codepunt wordt gebruikt wanneer een locale van één byte van kracht is. (Hoewel
er wordt hier niet op gecontroleerd als dit de uitvoering onredelijk zou vertragen.)

De landinstellingen van leveranciers staan ​​erom bekend dat ze fouten bevatten, en het is voor Perl moeilijk om de landinstellingen ervan te testen.
omgaan met code omdat deze interageert met code waar Perl geen controle over heeft; daarom
de locale-afhandelingscode in Perl bevat mogelijk ook fouten. (Echter, de Unicode-meegeleverd
locales zouden beter moeten zijn, en er is een feedbackmechanisme om eventuele problemen te corrigeren. Zien
"Vrij beschikbare localedefinities".)

Als u Perl v5.16 heeft, verdwijnen de hierboven genoemde problemen als u de
":not_characters" parameter naar de locale pragma (behalve voor bugs van leveranciers in de niet-
karaktergedeelten). Als u niet over v5.16 beschikt, en u do hebben landinstellingen die werken, met behulp van
ze kunnen voor bepaalde specifieke doeleinden de moeite waard zijn, zolang u maar rekening houdt met de
gotcha's die al genoemd zijn. Als de sortering voor uw landinstellingen bijvoorbeeld werkt, wordt deze uitgevoerd
sneller onder landinstellingen dan onder Unicode::Collate; en je krijgt toegang tot zaken als
het lokale valutasymbool en de namen van de maanden en dagen van de week. (Maar naar
hamer op het punt: in v5.16 krijg je deze toegang zonder de nadelen van landinstellingen
met behulp van de ":not_characters"-vorm van het pragma.)

Opmerking: het beleid om landinstellingen te gebruiken voor codepunten die in een byte passen, en Unicode
regels voor degenen die dat niet kunnen, worden niet uniform toegepast. Vóór v5.12 was dit enigszins het geval
lukraak; in v5.12 werd het redelijk consistent toegepast op het matchen van reguliere expressies
behalve voor tekenklassen tussen haakjes; in v5.14 werd het uitgebreid naar alle regex-overeenkomsten; En
in v5.16 naar de behuizingsbewerkingen zoals "\L" en "uc()". Voor sorteren, in alle releases
tot nu toe wordt de functie "strxfrm()" van het systeem aangeroepen, en wat deze ook doet, het is wat je krijgt.

Gebruik perllocale online met behulp van onworks.net-services


Gratis servers en werkstations

Windows- en Linux-apps downloaden

Linux-commando's

Ad