Ik ben momenteel aan het experimenteren met php. Ik zou graag een berekening uit laten voeren, waarbij met de input van een form dingen worden berekend.

Als aangevinkt wordt dat mensen een nieuwe koelmachine aanvinken moet waarde 3 worden ingevuld. Indien geen nieuwe waarde wordt aangevinkt, is een andere reeds bekende $parameter geldig(middels een lijst met waarden).

$copkoelmachinenieuw = $_POST['vernieuwenkoelmachine']; // ja of nee, waarbij value bij nieuw is 3 en bij nee $copkoelmachineoud

$copkoelmachineoud = $_POST['COP'];

Hoe krijg ik dit werkend? Heb al aantal dingen geprobeerd, maar blijkbaar mis ik nog wat kennis.

Alvast bedankt!
De vraag rijst dan ook: waarom UTF-16 gebruiken? Welke lettercodes heb je nodig die niet in UTF-8 staan, in je PHP-code?
(Nog steeds) Off-topic:

Er zijn (multinationale) bedrijven die als bedrijfsregel hebben dat data in databases opgeslagen moet zijn als UTF-16. JavaScript werkt facto de standaard met UTF-16. Je hebt het gewoon lang niet altijd voor het kiezen welke encoding de data heeft waar je mee moet werken. Dus wanneer je op die data wilt afstemmen dan moet je PHP code dus met UTF-16 data of anderzins ge-encodeerde data uit de voeten kunnen. Het wil natuurlijk niet zeggen dat de PHP code zelf als UTF-16 moet worden opgeslagen.

Wat ik wel steeds merk als terugkerend punt, is dat programmeurs (waaronder ikzelf) met enige regelmaat pas in een laat stadium met het begrip encoding te maken krijgen. Het gaat steeds automagisch goed, Latin1 is default op -UX, Windows, en OSX, en compatible met ASCII. UTF-8 is compatible met ASCII, en er zijn veel misverstanden over Unicode, wat niet eens een encoding is. Dus om goed te begrijpen waarom het goed gaat, is begrip van encoding essentieel. Vooral als je een keertje moet afwijken van de standaard.

Maar als je de meeste literatuur, wordt er weinig tot geen aandacht in besteed. Sterker nog, er zijn heel de nodige sites die een poging doen om het uit te leggen, maar de plank net niet helemaal goed slaan. Dus ik wist heel lang niet waarom PHP 'agnostisch' was ten opzichte van encoding. Maar nu blijkt dus dat PHP helemaal niet agnostisch is, maar volledig afhankelijk van ASCII. Niet dat het erg is, er was alleen niemand die het even kort en bondig kon uitleggen.
Ik moet ook zeggen dat ik er, in de jaren dat ik bezig met met PHP, zeer zelden een probleem heb gehad met encoding.
Hooguit dat een ë niet goed werd weergegeven, maar dan deed ik wel iets als str_replace("&54i9n", "ë", $string);... dat werkte ook.

Later (zeg: 6 maanden geleden) dacht ik van: alles UTF8 (of LATIN1, wat dan ook).
Maar in de meeste websites geef ik dus (nog steeds niet) expliciet aan welke encoding nodig is. Gewoon, omdat het nu ook prima werkt.
.. maar dan deed ik wel iets als ..

Misschien begrijp ik het verkeerd? Als je met data werkt, dan moet je toch besef hebben van welke encoding de bits in je bytes representeren als je die bytes gaat bewerken. Hoe vaak kom je 'problemen met diakritische tekens' tegen, gewoon omdat men niet doorheeft wat encoding en transcoding is? Terwijl het in essentie simpel te begrijpen is, en je moet er even op letten, en dan ben je veel ellende voor. Bijvoorbeeld als je data in je database door onkunde keer op keer gemangeld wordt, waarna je geen idee meer hebt van hoe je je data kunt terugkrijgen? In een praktijksituatie heb ik meegemaakt dat iemand door een incompatible codepage te kiezen, met één onwetende druk op de knop 30 jaar werk heefd vernietigd. Men kwam er pas na 6 maanden achter dat de code niet ging werken, waardoor het werk van 60 man (maal een half jaar) overnieuw moest. Nu gun ik niemand zo'n praktijkervaring, maar ik vind de lakse houding over de belangrijkheid van encoding wel wat te wensen over laten:
in de meeste websites geef ik dus (nog steeds niet) expliciet aan welke encoding nodig is. Gewoon, omdat het nu ook prima werkt

Kan je vertalen naar: ik doe maar wat en ik geef er niets om totdat het fout is gegaan en er maar hard genoeg over geklaagd gaat worden.
Ik hoop niet dat een programmeur met dergelijke attitude nooit cruciale applicaties hoeft te maken, totdat-ie heeft begrepen dat de werkelijke waarde van data letterlijk van levensbelang kan zijn.
Ik hoop het ook niet.
Ik ben maar hobbist die thuis wat raak kloot en toevallig nog wat resultaat neer zet.
Encoding is iets wat je pas doet als je het nodig hebt en/of fout gaat.
Data opslaan doe je met mysql_-functies (toen nog wel) en welke encoding daarin zat... ach. Het werkte.
Pas als er problemen gaan ontstaan, ga je verder kijken.

Eddy
Off-topic:
Nouja, ergens is er wat voor te zeggen; iedereen heeft een beperkte hoeveelheid tijd tot z'n beschikking, al dan niet professioneel, waarin je iets wilt neerzetten. Encoding is alleen wel heel erg belangrijk, zonder dat je het in eerste instantie doorhebt, het is dan ook niet zo heel vreemd dat PHP6 volledig Unicode moest zijn. Helaas bleek dat zo lastig dat de ontwikkelaars PHP6 maar hebben overgeslagen. Dus zijn we toch weer op onzelf aangewezen.

Waarom je het wel wilt/moet weten:
Wanneer je iets programmeert of zelfs maar typt in een tekstverwerker heb je al onbewust met encoding te maken. Dat gaat goed zolang de encoding hetzelfde blijft. Je krijgt met encoding te maken bijvoorbeeld:
- als je even vlug een site klust en later de vraag naar boven komt om een webwinkel te bouwen en het euro-teken nodig is
- je wilt je site aanvullen met AJAX, en dan blijkt de benodigde encoding (Unicode) niet te passen op de default encoding van je OS cq. PHP (Latin1).
- je wilt maar zelfs iets inlezen van een CSV, tekstbestand met BOM, of zelfs XML schrijven via SimpleXML, XMLWriter of DOMDocument, die laatsten willen allemaal Unicode als input.
- je wilt iets lezen of wegschrijven naar je MySQL-database met een andere encoding

In al deze gevallen krijg je te maken met het overzetten van de ene encoding naar de andere, oftewel transcoding. Als je je daar niet bewust van bent, gaan de dingen zeker verkeerd (data wordt verkeerd geinterpreteerd of erger - karakters die niet naar de doelencoding worden gemapped raken domweg kwijt), en dat is jammer omdat het vooraf relatief simpel voorkomen had kunnen worden. Dan hoef je niet achteraf nog eens in alle voorkomende gevallen met str_replace() de diakritische tekens te vervangen voor HTML-entities, dat kost extra en dus onnodige resources, niet alleen van de CPU maar ook van je eigen ontwikkeltijd. Jij en je klant zijn uiteindelijk beter af als je van te voren aandacht hebt voor encoding.

Later (zeg: 6 maanden geleden) dacht ik van: alles UTF8 (of LATIN1, wat dan ook).

Het beste kan je Unicode gebruiken gebruiken voor je website of -applicatie, UTF-8 is de default van HTML5.

Korte checklist:
- je kunt je PHP files opslaan in UTF-8 omdat UTF-8 ASCII-compatible is zonder BOM of Byte Order Mark. Een BOM is niet van toepassing op UTF-8 en het zorgt dat er te snel HTTP headers worden verstuurd, dus dat willen we niet.
- je geeft encoding aan via HTTP-headers
header('Content-Type: text/html; charset="UTF-8"');

- je checkt de input die de browser naar PHP stuurt of de strings wel UTF-8 compliant zijn (*)
Bijvoorbeeld met een soort van is_utf8() -functie van een library als Portable UTF-8
- je gebruikt utf8mb4 als encoding voor tabellen en kolommen
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

- je stelt de verbinding met de database via mysqli of PDO in als UTF-8 (om automatische transcoding via de driver te voorkomen)
$db = new mysqli(...);
$db->set_charset('utf8mb4');
$db->query('SET NAMES "utf8mb4" COLLATE "utf8mb4_unicode_ci";');

- je moet een lettertype gebruiken dat de Unicode karakters ondersteunt die je wilt zien

Bij het programmeren in PHP moet je vervolgens op twee dingen blijven letten:
1.) De oudere, SBCS-functies (Single Byte Character Support) zoals strlen() en alle andere werken op byte-niveau, ze zijn niet geschikt voor UTF-8. Je moet dan de MBCS-functies (Multi Byte Character Support) gebruiken zoals mb_strlen(). PHP biedt niet voor alle SBCS-functies een MBCS-variant. Via het internet zijn libraries te vinden die PHP aanvullen.

2.) De nodige MBCS-functies van PHP werken alleen met de eerste Unicode plane en niet met de overige planes, de MBCS-functies zijn dus niet volledig Unicode compliant. Dat bemoeilijkt bijvoorbeeld gebruik van emoji en vele andere Unicode karakters. Gelukkig hebben we de meeste van die karakters niet nodig, en zijn er omwegen met notatie in andere vormen die weer ASCII-compliant zijn, en extra ruimte nodig hebben.
Hopelijk biedt PHP7 volledige ondersteuning voor Unicode, maar ik vermoed van niet anders hadden ze dat wel groots aangekondigd.

(*) Dit punt is waar het mij om te doen is bij het controleren van de $_SERVER['REQUEST_METHOD'] die door de browser wordt ingesteld. Gelukkig blijkt de tekst 'POST' altijd hetzelfde te zijn in zowel ASCII als Latin1 als Unicode.
Kan je van die korte checklist per kopje de uitwerking in PHP gegeven?
En wellicht als tutorial? Je weet er genoeg van (of doet dat zo lijken): dan blijft het namelijk ook voor het nageslacth gebundeld bestaan ;)
Wat ik wel steeds merk als terugkerend punt, is dat programmeurs (waaronder ikzelf) met enige regelmaat pas in een laat stadium met het begrip encoding te maken krijgen

Als je met data (uit databases of andere (externe) bronnen) werkt loop je hier toch vrij snel tegenaan.

Het "probleem" van PHP is dat het een lage instapdrempel heeft. Hobbyisten beginnen met "programmeren" voordat ze de basisbeginselen van HTML/CSS/JavaScript onder de knie hebben (laat staan dat ze een elementair begrip hebben van hoe HTTP werkt).

De truuk is ook om het simpel te houden. Een heleboel techno blabla en mensen haken af.

Een redelijk toegankelijk artikel is nog steeds: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).

En inderdaad, maak een tutorial oid, dit is best nuttige informatie allemaal, maar hier is niet de plaats om al dit soort kennis (hoe nuttig ook) te etaleren. Because off topic.
Er zijn tutorials genoeg, en zoals Thomas' artikel aangeeft zijn er geen excuses voor wie het niet weet. Maar voor de volledigheid heb ik m'n vorige post aangevuld met de info waar Eddy om vroeg.

En ik weet er inderdaad het nodige van omdat ik een paar jaar geleden ook op het punt kwam dat mijn zelfgeschreven programma bugs had met data en diakritische tekens.
Dit probeerde ik eerst ook op Eddy's manier op te lossen, maar wat ik aan de ene kant oploste ging aan de andere kant weer fout; en dat allemaal omdat ik niet volledig bewust was van encoding. Met als gevolg dat ik het na liet om op alle punten transcoding te doen.

Het heeft me dagen gekost om de bugs en de corrupt geraakte data in de database te herstellen. Na het instellen van Unicode als UTF-8 op de database, database driver, PHP, HTML (en CSS...) waren alle problemen als sneeuw voor de zon verdwenen.
Het herstellen van vertrouwen van gebruikers in het programma duurde ietsje langer, want voor de gebruikers is de data veel belangrijker dan het programma. Gelukkig is ook dat weer goedgekomen.

Reageren