PHP-nummer från sträng i int. Manipulations med PHP-datatyper


PHP kräver inte (och stöder inte) uttryckligen definierad typ när man förklarar en variabel Den typ av variabel bestäms enligt det sammanhang där den används. Det vill säga om du tilldelar strängvärdet för $ Var-variabeln blir $ Var en sträng. Om du sedan tilldelar $ var i ett heltal värde, blir det ett heltal.

Ett exempel på automatisk typomvandling är tillsatsoperatören " + "Om någon av operanderna är ett flytande punktnummer tolkas alla operander som ett flytande punktnummer, kommer resultatet också att vara ett flytande punktnummer. Annars kommer operanderna att tolkas som heltal och resultatet kommer också att vara heltal. Observera att detta inte ändrar de olika typerna av operanderna själva; bara som de beräknas. Några praktiska exempel:

$ Foo \u003d "0"; // $ foo är en sträng (ASCII 48)
$ foo + \u003d 2; // $ foo nu ett heltal (2)
$ Foo \u003d $ foo + 1.3; // $ foo nu ett flytande punktnummer (3.3)
$ Foo \u003d 5 + "10 små piggies"; // $ foo är ett heltal (15)
$ Foo \u003d 5 + "10 små grisar"; // $ foo är ett heltal (15)
?>

Om du vill testa något av de exempel som anges i det här avsnittet kan du använda funktionen var_dump () .

Uppmärksamhet: -1 Överväga Sann., som alla icke-noll (negativt eller positivt) nummer!

Exempel på transformationer:

Var_dump (bool) "); // bool (false)
var_dump ((BOOL) 1); // bool (sant)
var_dump ((BOOL) - 2); // bool (sant)
var_dump (bool) "foo"); // bool (sant)
var_dump (BOOL) 2.3e5); // bool (sant)
var_dump (BOOL) Array (12)); // bool (sant)
var_dump (bool) array ()); // bool (false)
var_dump (bool) "false"); // bool (sant)
?>

Konvertera från typ booleska

Falsk konverteras till 0 (noll), och Sann. - i 1 (enhet).

Flytkonvertering

När man konverterar från en flytande punkt till ett heltal, kommer numret att avrundas i riktning mot noll.

Om det flytande punktnumret överstiger gränserna för hela (som regel är det +/- 2,15E + 9 \u003d 2 ^ 31), kommer resultatet att vara osäkert, eftersom hela inte har tillräcklig noggrannhet för att returnera det korrekta resultatet . I det här fallet kommer ingen varning inte att återkallas

Uppmärksamhet! Ge aldrig en okänd fraktion i det hela, eftersom det ibland kan ge oväntade resultat, till exempel:

echo (int) ((0,1 + 0,7) * 10); // Visar 7!
?>

Strängkonvertering

Transformationer från andra typer

För andra typer definieras inte konverteringsbeteendet. För närvarande är beteendet detsamma som om värdet var först. men inte Lita på detta beteende, eftersom det kan förändras utan varning.

Booleo ( booleska.) Värde Sann. konverteras till strängen "1" och värdet Falsk Det verkar som "" (tom sträng). På så sätt kan du konvertera värden i båda riktningarna - från boolesktyp till en sträng och vice versa.

Hel ( heltal) eller ett flytande punktnummer ( flyta.) Det omvandlas till en sträng representerad av numret som består av sina nummer (inklusive en indikator på graden för ett flytande punktnummer).

Arrays konverteras alltid till "array" -strängen, så att du inte kan visa innehållet i matrisen ( array.) Använder sig av echo () eller skriv ut ()För att ta reda på vad den innehåller. För att se ett element måste du göra något som ett Echo $ ARR ["foo"]. Se nedan tips om hur du visar / visa allt innehåll.

Objekt konverteras alltid till "Objekt" -strängen. Om du vill visa värdet på medlemmen i objektet ( objekt.) För felsökning, läs följande stycken. Om du vill få namnet på klassen av det önskade objektet, använd get_class () .

Resurser omvandlas alltid till strängar med strukturen "Resurs ID # 1", där 1 är ett unikt resursnummer ( resurs), tilldelad till honom PHP under utförandet. Om du vill få en resurstyp, använd.

NULL Alltid konverterad till en tom sträng.

Utgången av arrays, objekt eller resurser ger dig inte någon användbar information om värdena själva. Ett lämpligare sätt att mata ut värden för felsökning - Använd funktioner print_r () och var_dump () .

Du kan också konvertera PHP-värden till strängar för konstant lagring. Denna metod kallas serialisering och kan utföras med användning av en funktion. serialize () . Dessutom, om du har ett WDDX-stöd i din PHP-inställning, kan du serialisera PHP-värden i XML-strukturen.

Konvertera till array typ (arrays)

För vilken typ som helst: heltal, flyta., sträng, booleska. och resursOm du konverterar värdet till en array får du en array med ett element (med ett index 0), vilket är det skalära värdet från vilket du började.

Om du konverterar objektet till en array ( objekt.), Kommer du att få en rad av egenskaperna (medlemsvariabler) för detta objekt som element. Nycklarna kommer att vara namnen på medlemsvariablerna.

Om du konverterar till ett arrayvärde NULLDu får en tom array.

Konvertering till objekttyp (Objekt)

Om objektet konverteras till objektet ändras det inte. Om objektet omvandlas till värdet av någon annan typ skapas en ny instans av den inbyggda STDClass. Om värdet var tomt, kommer den nya instansen också att vara tom. Med något annat värde kommer det att innehålla i skalärmedlemsvariabeln:

$ Obj \u003d (objekt) "ciao";
Echo $ obj -\u003e skalär; // kommer "ciao"
?>

Information var hela tiden symboler. Endast när programmeringen kom fram blev det delvis bokstäver, siffror och tecken (i formell betydelse).

Upp till den berömda tiden var muntligt tal mest populära, självgjorda symboler, gester, liksom konstverk, i synnerhet. Det är viktigt att alla dessa alternativ för den naturliga presentationen av information från små till stor kan alltid beskrivas i ord, det vill säga att du kan få tillgång till programvara i en viss mening.

Rader och siffror

Rader är framförallt totaliteten av olika tecken. I olika programmeringsverktyg separerades fraktionerna från det hela annorlunda. Några föredragna punkten, andra kommatecken (i PHP, radövervandlingen till numret innebär. ""). Triagnade separerades av en enda apostrof, kommatecken eller ett utrymme. De reella talen registrerades genom bokstaven "E".

Alla dessa formaliteter. Matematik och principer för något processor har alltid erkänt siffrorna utan överskott, och de relevanta ytterligare processorerna utvecklades med reella värden.

Men världen av variabler av variabeltyp (för ERA startprogrammen) och genomförandet av den moderna tanken om konsensusen för alla typer av data betyder: i PHP konvertera en sträng till numret ändå att ingenting är gjort. I bästa fall kommer PHP "att skära", eller snarare, kommer att göra 0 eller nummer om det finns minst en siffra i den ursprungliga linjen. Alla siffror till den första icke-engagemangssymbolen kommer att göra detta nummer.

Allmän omvandlingsregel

På PHP är radomvandlingen i ett nummer om programmeraren inte anger en annan, sker automatiskt vid användningstillfället. Om variabeln endast innehåller siffror och en punkt, kan ett reellt tal erhållas. Om kommatecken möts i sekvensen av siffror, så kommer allt som går till det att tolkas som ett tal, naturligt, hela.

Varje icke-tillskottssymbol i antalet nummer stoppar processen, och resultatet av att konvertera PHP "rad till numret" kommer bara att vara den mening som bildades till den första icke-merpure-symbolen.

Matematik och symbolbehandling

Det som är svårare, först eller andra, även från formlerna, som inte är placerade på sidan, imponerande matriser, grafer, att unravel, som ibland inte ens kan författare härledda från integraler, skillnader från integraler och polynomier i n-volymen Generation, att säga mycket enkelt: samhället, utan tvivlar, hedrar förmånen av matematik och matematiker, men bearbetningen av tecken är viktigare, mer komplicerad och täcker matematik, som en döende filt, vilket ger ett nyfiken sinne som inte kan gå utöver den magiska av siffror, en gynnsam miljö för kreativitet.

Vanligtvis på PHP-raden till numret konverteras automatiskt, men det kommer aldrig att vara överflödigt för att kolla in det. Det är bäst att alltid vara säker: PHP förstår korrekt att en eller annan variabel är ett nummer. Om det finns en skugga av tvivel, bör du uttryckligen ange vilken typ av variabel (INT) eller (flottör) före värdet och kontrollera hur PHP förstår vilken typ av funktion som variabel är () eller is_float ().

Trender av modern programmering

Den klassiska tolkningen av uppgiften på PHP "-linjen till numret" ligger inom representationerna av modern programmering. Den omvända processen har betydligt mer olika alternativ. Funktioner number_Format (), Printf (), Sprintf () Du kan arbeta underverk, och inte bara på nivån, men också grupper av siffror.

PHP-transformation " rad till numret "vittnar, snarare, det och det här kan, men mamentics och numeriska beräkningar är inte vår häst.

Skriv en anständig och pålitlig funktion som implementerar en eller annan bearbetning av siffror till PHP inte representerar problem, och resultatet blir inte sämre än resultatet från mer matematiska språk. PHP är först och främst serverns språk, språk för behandling av information, inklusive matematisk natur.

Bland de olika programmeringsuppgifterna är olika manipuleringar med värdena för datum och tid ganska vanliga. Ett sällsynt automatiserat system kan databasen utan att spara information om tiden för denna eller den processen. Förutom det enklaste tillägget av datumet till databasposten eller visa det här datumet finns det många uppgifter att mata ut dessa datum i en annan form, kontrollera korrespondensen av den aktuella tiden med en viss timer, beräkningen av perioden mellan två datum och mycket mer.

För bekvämligheten med datum har varje programmeringsspråk sina egna speciella datatyper för att lagra datum och tidsvärde. Oftast är detta ett numeriskt värde, eller ett heltal eller flytande punkt.

I PHP står arbetet med datumet oftast inför UNIX Timestamp. Här lagras tiden i ett heltal. Kalkylen av tiden börjar den 1 januari 1970. Därför, till exempel datum och tid 11.12.2014 19:40:00, kommer det att representeras av antalet 1418316000. Denna siffra visar hur många sekunder som skickas från nolldatum den 1 januari 1970, kallad Unix-tiden.

Ett exempel på en PHP-sida som tillhandahåller datakonverteringsfunktioner på webbplatsen i programavsnittet "Konvertera datum och tidsformat". Här kan du bilda önskat datum i Unix Timestamp-formatet, liksom ta med detta format till en standard, förståelig vy.

Få aktuell tid och datum i PHP

För att få den aktuella serverns tid används en funktion.

int tid (tomrum)

som kommer att returnera värdet i UNIX Timestamp-format.

echo tid (); // Utgång av den aktuella tiden i UNIX Timestamp-format

Vid första anblicken är ett mycket bekvämt format för en person, men som är känt, den enklare utsikten över data, desto snabbare bearbetning av dessa värden av datorn utförs. Dessutom är lagringen av numret i databasen mycket mer ekonomiskt än något speciellt format. Dessutom fungerar PHP med tiden lika och på UNIX och på Windows-plattformen, vilket ger möjlighet att använda koden på någon av dessa plattformar.

Konvertera datum och tidsformat i PHP

Den enklaste mekanismen som låter dig konvertera ett numeriskt värde till mer begripliga värden, tillhandahålls av funktionen:

array GetDate ()

Den returnerar en associativ array som innehåller information om datumet. Om tidsstämpelparametern inte är angiven, kommer den aktuella tiden att returneras. Den här arrayen innehåller följande värden:

Den resulterande arrayen låter dig visa värdet i önskad form:

$ DATUM \u003d 1418372345;
$ DATE_MAS \u003d GETDATE ($ DATE);
echo $ Date_mas ["May"]. ".". $ DATE_MAS ["MON"]. ".". $ DATE_MAS ["År"]; // 12/12/2014


För att konvertera datum och tidsformat kan du också använda funktionen:

string Date (String $ Mall [, int $ unix_timestamp])

Den är utformad för att ta emot det aktuella datumet för UNIX Timestamp i önskat format. Den $ mallsträngsparametern bestämmer utmatningsformatet. Den $ unix_timestamp-parametern kan ställas in, med vilken tid tiden utförs. Det är valfritt, så om du inte anger det, kommer det aktuella datumet och tiden att användas.

Formatet är inställt i följande värden:

a."TILL" OCH "AFTER" MOON: "AM" eller "PM"
A."Till" och "efter" middag i stora bokstäver: "Am" eller "PM"
d.dag i månaden 2 siffror (om mindre än 10, i den första platsen noll) (från 01 till 31)
D.dag i veckan 3 bokstäver. Till exempel, "mon" (måndag)
j.månadens dag, 1-2 nummer utan initial nollor (från 1 till 31)
F.namnet på månaden. Till exempel, "januari"
h.timme, 12-timmarsformat (från 01 till 12)
H.timme, 24-timmarsformat (från 00 till 23)
g.timme, 12-timmarsformat utan nollor (från 1 till 12)
G.timme, 24-timmarsformat utan nollor (från 0 till 23)
jagminuter (från 00 till 59)
Jag (kapital I)1, om det finns en dagsljus, annars 0
L.1, om årets språng, eller 0 om inte språng
B.tid i Internet-tidsformat (Alternativt Time Counting System) (från 000 till 999)
T.datorns tidszon. Till exempel mdt.
l (små bokstav l)veckodag. Till exempel "måndag"
m.månad, två siffror med nollor (från 01 till 12)
n.månad, en eller två siffror utan nollor (från 1 till 12)
M.förkortat namn på månaden. Till exempel, "Jan"
t.antal dagar i den angivna månaden (från 28 till 31)
s.sekunder (från 0 till 59)
S.engelska-språksekvens suffix Antal två bokstäver ("ST", "ND", "RD" eller "TH")
U.ett heltal antal sekunder sedan början av UNIX-eran
y.År, digitala, 2 siffror (14)
Y.År, digitala, 4 siffror (2014)
z.dagens ordinära antal (från 0 till 365)
Z.blandningstidszon i sekunder (från -43200 till 43200)
N.sekvensnumret för veckodagen från 1 (måndag) till 7 (söndag) i enlighet med ISO-8601-standarden (tillsatt i PHP 5.1.0)
w.sekvensnumret för veckodagen från 0 (söndag) till 6 (lördag)
W.Årets sekvensnummer i enlighet med ISO-8601-standarden; Veckor börjar från måndag (läggs till i php 4.1.0)
o.antal året i enlighet med ISO-8601-standarden. Den har samma betydelse som Y, förutom fallet när antalet ISO (W) vecka är ett av föregående år. Då kommer året i veckan att användas. (Tillagd i PHP 5.1.0)
e.kodzonskalskoden. Till exempel: UTC, GMT, Atlanten / Azorerna (tillsatt i PHP 5.1.0)
O.skillnaden med tiden för Greenwich, dygnet runt. Till exempel: +0200
P.skillnad med Greenwich Time med en kolon mellan klockan och minuter. Till exempel: +02: 00 (tillsatt i PHP 5.1.3)
c.datum i ISO 8601 Standardformat. Till exempel, 2014-12-12T15: 19: 21 + 00: 00 (PHP 5 tillsatt)
r.datum i format »RFC 2822. Till exempel: THU, 21 dec 2000 16:01:07 +0200
U.antal sekunder som har gått sedan början av UNIX-eran (Unix Epoch, 1 januari 1970 00:00:00 GMT)

Som du kan se från listan kan du få mycket användbara data på den här funktionen. Till exempel:

$ DATUM \u003d 1418372345; // Källa Datum och tid 12.12.2014 11:19:05

echo datum ("d.m.y", $ datum); // 12/12/2014 (datum)
echo Datum ("H: I: s", $ Datum); // 11:19:05 (tid)
echo Datum ("H: I", $ Datum); // 11:19 (tid)
echo Date ("T", $ Datum); // 31 (antal dagar i en månad)
echo Date ("Z", $ Datum); // 345 (sekvensnummer på dagen per år)
echo Datum ("L DS \\ OF Y H: I: S A", $ Datum); // fredag \u200b\u200b12 december 2014 11:19:05

Andra tecken som ingår i mallen visas i raden som den är. Om du behöver ange ett tecken som används i funktionen som en formatkod, är "\\" -symbolen införd framför dem. För värdet "\\ n" (övergång till en ny sträng) bör du ange "\\\\ n". Således kan du dra ett helt meddelande som innehåller information om datum och tid:

echo Date ( "Idag Z-t-dagen y-året", $ datum); // Idag är den 345: e dagen 2014

Konvertera datum och tid i Timestamp-format

För omvänd konvertering av datumet från standardformatet till det numeriska värdet av tidsstämpel används en funktion:

iNT MKTIME (]]]]]])

MKTIME () -funktionen returnerar tidsvärdet för UNIX, motsvarande datum och tid som anges av argumenten. Till exempel:

$ My_date \u003d mktime (10, 30, 0, 12, 12, 2014);

Det bör noggrant relateras till ordningen för funktionens argument: timmar, minuter, sekunder, månad, dag, år.

Förutom den enkla bildandet av datumvärdet i Timestamp kan funktionen MKTIME () användas för aritmetiska beräkningar med datum. För att göra detta kan du helt enkelt ange de nödvändiga argumenten. Till exempel, om du anger 14 månader, då i det slutliga värdet, kommer månaden att vara 2: a, och årets värde kommer att öka med en:

$ My_day \u003d 12;
$ My_month \u003d 12;
$ My_year \u003d 2014;

$ new_date \u003d mktime (0, 0, 0, $ my_month + 5, $ my_day, $ my_year);

echo datum ("d.m.y", $ new_date); // 12.05.2015 (Datum)

På samma sätt kan du agera med andra parametrar.

Verifiering av korrektheten av datumet i PHP

När du arbetar med datum, speciellt när datumet genereras ovanför MKTIME () -funktionen är det nödvändigt att ta hänsyn till korrektheten av den angivna tullen. För att göra detta använder PHP en funktion:

bool checkdate (int månad, int dag, int år)

Returnerar sant om det datum som anges av argumenten är korrekt Annars returnerar falska. Datumet anses vara korrekt om:

År som sträcker sig från 1 till 32767;

Månad som sträcker sig från 1 till 12;

Dagen för en given månad, med hänsyn till språngåret, är korrekt.

Exempel Kontrollera datum:

$ My_day \u003d 32;
$ My_month \u003d 12;
$ My_year \u003d 2014;

om (! Checkdate ($ my_month, $ my_day, $ my_year))
eko. "Fel: Datum är felaktigt";

Jag har en ansökan som berör kunder från hela världen, och självklart vill jag att allt ska komma in i mina databaser, det kodades i UTF-8-kodningen.

Det största problemet för mig är att jag inte vet vilken kodning av källan till någon rad kommer att vara - det kan vara från textfältet (användning

Används endast om användaren verkligen skickade en form), eller det kan vara från en laddad textfil, så jag kan verkligen inte styra ingången.

Jag behöver en funktion eller en klass som säkerställer att materialet som kommer in i min databas är så långt som möjligt UTF-8-kodningen. Jag försökte iconv ($ text), "UTF-8", $ Text); Men det har problem (om "Fiancée" -inmatning, det returnerar "Fianc"). Jag försökte många saker \u003d /

För att ladda ner filer gillar jag idén att be slutanvändaren att ange kodningen de använder och visa dem en förhandsgranskning av hur slutsatsen kommer att se ut, men det hjälper inte till obehagliga hackare (det kan faktiskt göra sitt liv lite lättare).

Jag läste andra frågor om denna fråga, men de verkar ha subtila skillnader, till exempel "Jag måste demontera RSS-flöden" eller "Jag tar bort data från webbplatser" (eller, "Du kan inte").

Men det måste finnas något som åtminstone har ett bra försök!

9 svar

Vad du frågar är extremt svåra. Om möjligt är det bäst att ställa in användarens kodning. Ett förebyggande av angrepp bör inte vara mycket lättare eller svårare.

Du kan dock försöka:

Iconv ($ Text, MB_Detect_order (), sant), "UTF-8", $ Text);

Att installera ett strikt värde kan hjälpa dig att få det bästa resultatet.

I Rysslands hemland har vi 4 populära kodningar, så din fråga är mycket efterfrågan.

Endast char symbolkoder som du inte kan upptäcka kodningen, eftersom kodsidorna skär. Vissa kodsidor på olika språk har till och med ett fullständigt korsning. Så, Vi behöver ett annat tillvägagångssätt.

Det enda sättet att arbeta med okända kodningar är att arbeta med sannolikheter. Så vi vill inte svara på frågan "Vad är kodningen för den här texten?" Vi försöker förstå " Vad är sannolikt kodning av den här texten?".

En kille från den populära ryska teknologiska bloggen kom fram med detta tillvägagångssätt:

Skapa en karkoder för varje kodning du vill stödja. Du kan bygga den med några stora texter på ditt språk (till exempel, någon form av fiktion, använd Shakespeare för engelska och Tolstoy för ryska, lol). Du kommer att få något så här:

Encoding_1: 190 \u003d\u003e 0.095249209893009, 222 \u003d\u003e 0.095249209893009, ... Encoding_2: 239 \u003d\u003e 0.095249209893009, 207 \u003d\u003e 0.095249209893009, ... Encoding_n: Charcode \u003d\u003e Sannolikhet

Ytterligare. Du tar texten i en okänd kodning och för varje kodning i din "probabilistiska ordbok" letar du efter frekvensen för varje symbol i text med okänd kodning. Den totala sannolikheten för symboler. Kodning med stort betyg är förmodligen vinnaren. Bästa resultat för stora texter.

Om du är intresseradJag kan gärna hjälpa dig med den här uppgiften. Vi kan avsevärt förbättra noggrannheten genom att skapa en lista med sannolikhet med två tecken.

Btw. Mb_detect_encoding certanly fungerar inte. Ja, i allmänhet. Kontrollera källkoden MB_Detect_encoding i "Ext / mbstring / libmbfl / mbfl / mbfl_ident.c".

Du försökte antagligen det, men varför inte bara använda mb_convert_encoding-funktionen? Han kommer att försöka automatiskt bestämma charet med den medföljande texten eller du kan överföra den till listan.

Dessutom försökte jag springa:

$ TEXT \u003d "Fiancée"; Echo mb_convert_encoding ($ Text, "UTF-8"); Echo "

"; Echo iconv (mb_detect_encoding ($ text)," UTF-8 ", $ Text);

och resultaten är desamma för båda. Hur ser du att din text är avkortad till "Fianc"? Är det i databasen eller i webbläsaren?

Det är omöjligt att identifiera kodningen av strängen, som är helt exakt. Det finns sätt att försöka gissa kodningen. En av dessa metoder är förmodligen / för närvarande det bästa i PHP, det är MB_Detect_encoding (). Den skannar din sträng och söker inträde av saker som är unika för vissa kodningar. Beroende på din linje kan det inte finnas sådana särskiljbara fall.

Ta ISO-8859-1 och ISO-8859-15 Encoding (http://sv.wikipedia.org/wiki/iso/iec_8859-15#changes_from_iso-8859-1)

Det finns bara några olika karaktärer, och att de förvärras, de skickades till samma byte. Det är omöjligt att detektera, efter att ha fått en sträng, inte att veta dess kodning om byte 0xa4 ska betecknas med ¤ eller € i raden, så det finns inget sätt att ta reda på dess exakta kodning.

(Obs! Du kan lägga till en mänsklig faktor eller en ännu mer perfekt skanningsmetod (till exempel, som erbjuder OOBOROS102) för att försöka ta reda på det omgivande sammanhanget, om tecknet ska vara ¤ eller €, även om det verkar som en bro för långt)

Det finns mer särskiljbara skillnader mellan, till exempel UTF-8 och ISO-8859-1, så det är fortfarande värt att försöka förstå detta när du är osäker, även om du kan och borde inte lita på vad det är korrekt.

Det finns andra sätt att säkerställa rätt kodning. När det gäller formulären, försök så mycket som möjligt UTF-8 (kontrollera snögubben för att se till att du representerar UTF-8 i varje webbläsare: http://intertwingly.net/blog / 2012/07/29/rails- och -Snowmen) Detta görs åtminstone du kan vara säker på att varje text som presenteras via dina formulär är UTF_8. För laddade filer, försök att starta UNIX "File -i" -kommandot på det, till exempel. Exec () (om möjligt, på din server) för att hjälpa till att upptäcka (med hjälp av dokumentspecifikationen). När det gäller klättringsdata kan du läsa HTTP-rubriker, som vanligtvis definierar kodningen. När du analyserar XML-filer, se om XML-metadatan innehåller definitionen av en uppsättning tecken.

Istället för att försöka automatiskt gissa kodningen måste du först försöka ge en specifik kodning själv, om möjligt, eller försök att få en definition från källan från vilken du får det (om tillämpligt) innan du får detektering.

Det viktigaste problemet för mig är att jag inte vet vilken kodning av källan till någon rad kommer att vara - det kan vara från textfältet (användningen är användbart endast om användaren verkligen skickat en form) eller det kan vara från de nedladdade Textfil, så jag kan verkligen inte styra ingången.

Jag tror inte att det här är ett problem. Ansökan känner till ingångskällan. Om det här är från formuläret, använd UTF-8-kodning i ditt fall. Det fungerar. Se till att de angivna data är korrekt kodad (verifiering). Tänk på att inte alla databaser stöder UTF-8 i sin helhet.

Om det här är en fil sparar du inte den i UTF-8-kodningen i databasen och i binär form. När du visar en fil igen, använd också binär utmatning, då är den helt transparent.

Din idé är bra att användaren kan säga kodning om han / hon fortfarande kan säga efter nedladdning av filen, eftersom den är binär.

Därför måste jag erkänna att jag inte ser ett specifikt problem som du ger upphov till din fråga. Men kanske kan du lägga till några detaljer om ditt problem.

Grim, det finns riktigt bra svar och försök att svara på din fråga här. Jag skulle vilja tacka alla för deras svar. De är underbara. Jag är inte en kodande mästare, men jag förstår din önskan att ha en ren UTF-8-stack i din databas. Jag använder MySQL UTF8MB4 för tabeller, fält och anslutningar.

Min situation kom ner till "Jag vill bara ha mina desinfektionsmedel, valider, affärslogik och beredda uttalanden behandlade UTF-8 när data kommer från HTML-formulär eller registrera länkar via e-post." Så enligt min mening började jag med den här idén:

  • Försök att upptäcka kodning: $ Encodings \u003d ["UTF-8", "ISO-8859-1", "ASCII"];
  • Om kodningen inte kan detekteras, kasta ny runtimeException
  • Om du anger UTF-8, fortsätt.
  • Annars, om det är ISO-8859-1 eller ASCII

    men. Försök att konvertera till UTF-8 (väntar, inte slutfört)

    b. Bestäm kodningen av det konverterade värdet

    med. Om det rapporterade kodade och konverterade värdet är UTF-8, fortsätt.

    annars, kasta ny rundimeException

Från min abstrakta klass sanitizer

Privat funktion ISUTF8 ($ Encoding, $ Value) (Retur (($ Encoding \u003d\u003d\u003d "UTF-8") && (utf8_encode) \u003d\u003d\u003d $ värde));) Privat funktion utf8tify (& $ värde) ($ Encodings \u003d ["UTF-8", "ISO-8859-1", "ASCII"]; MB_Internal_encoding ("UTF-8"); MB_Substitute_Character (0xFFF); // ersättningskaraktär MB_Detect_order ($ kodningar); $ stringencoding \u003d mb_detect_encoding ($ Värde, $ kodningar, sant); om (! $ Stringencoding) ($ värde \u003d null; kasta ny \\ runtimeException ("oförmögen att identifiera teckenkodning i sanitizer.");) Om ($ This-\u003e ISUTF8 ($ stringencoding, $ värde)) (retur) annars ($ värde \u003d mb_convert_encoding ($ värde, "UTF-8", $ stringencoding); $ stringencoding \u003d mb_detect_encoding ($ värde, $ kodningar, sant); om ($ this-\u003e isUTF8 ($ Stringencoding, $ värde)) (retur) annars ($ värde \u003d null; kasta ny \\ rundimeException ("Kan inte konvertera teckenkodning från ISO-8859-1 eller ASCII, till UTF-8 i sanitizer.");)) Lämna tillbaka;)

Det skulle vara möjligt att argumentera för att jag skulle skilja problemen med kodning från min abstrakta sanitizer-klass och helt enkelt sätta in kodningsobjektet i ett specifikt barninstans av sanitizer. Det största problemet med mitt tillvägagångssätt är dock att jag avvisar de kodande typerna utan någon kunskap, som jag inte behöver (och jag är beroende av PHP MB_ * -funktionen). Utan ytterligare studie kan jag inte veta om smärtan gör ont i vissa människor eller inte (eller om jag förlorar viktig information). Därför behöver jag veta mer. Jag hittade den här artikeln.

Högtalarna har inte prioritet före verkliga, men de är avsedda på många sätt "inte digitalt" syfte. Det exakta numret med ett visst antal siffror och / eller i ett specifikt värdeområde är vettigt att generera CSS-regler, kan användas som en array-nyckel eller en unik kod för inspelning av databasens rad. Ett heltal kan vara en del av en unik kod, lösenord eller kontrollsumma i dataöverföring. Ett heltal är långt ifrån matematik och numeriska metoder, det är ofta ett element i detta eller dess kod.

Betydelsen av den intval () funktionen

Den intval () PHP-funktionen används för att konvertera "variabeln till helheten", har två parametrar och en dubbel betydelse.

Den andra parametern är grunden för det erforderliga nummersystemet. Standard är ett decimaltal. Om du inte anger den andra parametern, anses numret som börjar med "0" -symbolen oktal, och med tecknen "0x" - hexadecimal.

Den andra parametern är att den första parametern är en rad tecken.

De två sista exemplen (mycket stora värden) visar att resultatet är olämpligt. I huvudsak är värdet av maskinen (operativsystem) viktigt här. I praktiken har omvandlingen av sådana siffror ingen särskild betydelse.

Logiken i INTVAL PHP-funktionen är att konvertera en sträng eller heltal för praktisk tillämpning. Till exempel, för att bilda en CSS-regel, som endast använder heltal. Konvertera ett reellt antal till ett enkelt anfall bara en hel del.

Tillämpning av ETVAL () -funktionen

Den intval () funktionen i PHP är inte det enda heltalet för syftet. Du kan använda runda (), tak () och golv (). Dessa funktioner fungerar med den allmänt accepterade avrundningslogiken.

Den intval () PHP-funktionen saknar någon logik och verkar på principen för att få ett heltal. Om det behövs, på önskad grund för det önskade nummersystemet.

Exemplen på intval () PHP visar att huvudområdet för dess applikation är logiken hos algoritmen, och inte logiken för beräkningar.

Den här funktionen är det perfekta datalegenereringsverktyget för korrekt visning av HTML-sidan (använd i CSS-reglerna och HTML-taggributen) och skapa tangenter av arrays, databasbordsrader, numrering av åtgärd, händelseräkning.







2021. gtavrl.ru..