encoding
VB het unicode karakter 'thumbs up' wordt: Ø=ÜM
en België ! wordt: ¡B¡e¡l¡g¡i¡ë¡ ¡!
Iemand enig idee hoe ik hiervan terug UTF-8 codering kan maken. Heb al allerlei combinatie geprobeerd met iconv in php, maar lukt me niet...
alvast hartelijk dank voor de hulp.
Welke encoding wordt in de HTTP-headers van de API-response genoemd?
als ik Ø=ÜM google kom ik hierop uit: http://boards.straightdope.com/sdmb/showthread.php?t=782750
en daar zeggen ze: It is a UTF-8 version of an emoticon coding. If you write it out in hexadecimal is D83D DC4D, which is the thumbs up character. https://apps.timwhitlock.info/unicode/inspect?s=%F0%9F%91%8D
Het zou dus om een UTF-8 encoding gaan van ????
Maar dat lijkt me raar, want ???? in UTF-8 geeft gewoon ????
edit: hier in het forum gaat er dus duidelijk ook iets mis met unicode karakters. :-)
Gewijzigd op 15/01/2018 21:46:08 door r dc
De opmerking over encoding op dit forum is mij ook opgevallen. Bij de advertenties valt het ook op.
Klopt, dat moet inderdaad verholpen worden.
@r dc zorg dat je zelf de data ook presenteert/opslaat als UTF-8, oftewel, zorg dat je een meta tag en/of PHP-header gebruikt, maar ook dat je een character encoding instelt als je je data wegschrijft naar je database.
EDIT: en als je database tabellen latin1 zijn, dan worden speciale karakters gedowngrade naar ???? omdat latin1 deze karakters niet kent. Mogelijk moet je ook utf8mb4 gebruiken om alle multibyte karakters te laten passen in je database, utf8 (de encoding in MySQL) bestrijkt niet dezelfde set als UTF-8.
Gewijzigd op 15/01/2018 22:43:46 door Thomas van den Heuvel
Heel concreet heb ik dus een string in php die volgende letters bevat: Ø=ÜM
En hiervan wil ik het unicode karakter 'thumbsup' maken (in UTF-8: F0 9F 91 8D)
Hoe doe ik dit?
@ivo p: zie eerste post "Heb al allerlei combinatie geprobeerd met iconv in php, maar lukt me niet..."
R dc op 16/01/2018 11:34:33:
@Thomas Dit is geen database probleem. De foute encoding is extern en buiten bereik. Ik kan deze niet aanpassen. Ik wil ze op mijn platform wel ongedaan maken.
Dit lijkt mij iets wat mogelijk aan die kant opgelost moet worden. Ik zie ook niet hoe je van jouw input naar een thumbs-up emoji zou moeten gaan. Mogelijk is er iets lost in translation in welk geval je simpelweg niet van A naar B kunt komen...
... aan de andere kant: misschien ligt dit ook niet aan de API zelf maar aan een station ervoor? Misschien wordt er al corrupte data gevoerd aan de API? Ik bedoel, is de bron van de data die voor problemen zorgt elke keer dezelfde? Of zijn er meerdere bronnen die via die API werken en levert dat allemaal corrupte data op? In het laatste geval is het misschien waarschijnlijker dat de API roet in het eten gooit, maar anders? Mogelijk valt er niets op te lossen omdat het probleem niet in de API zelf zit?
Kun je dit mogelijk zelf testen? Je geeft ook bar weinig informatie over de API, wat het voor ons redelijk onmogelijk maakt om ons een voorstelling te maken van hoe dat ding werkt. Zijn er misschien andere gebruikers/API-afnemers die dezelfde problemen hebben? Heeft dat ding een FAQ/support forum et cetera.
als ik Ø=ÜM omzet naar utf-16 code units krijg ik: 00D8 003D 00DC 004D
de Ø=ÜM code points in hex geven: D8 3D DC 4D
het thumbsup karakter omzetten naar utf-16 code units: D83D DC4D
Het is dus perfect mogelijk om op byte niveau de omzetting te doen. Maar ik geraak er niet in php, omdat ik de syntax onvoldoende beheers.
Waarom kom je niet met meer informatie over de API? Wat is het voor API, is een officiële API met documentatie, heb je een link naar de API?
Na wat verder onderzoek is het blijkbaar de manier waarop de urlencoding / decoding werkt.
De API stuurt unicode text door als volgt:
Hallo [thumbsup] test -> %00H%00a%00l%00l%00o%00+%D8%3D%DCM%00+%00t%00e%00s%00t%00
en php maakt daar volgende UTF-8 tekst van: H a l l o Ø=ÜM t e s t
Code (php)
1
2
3
4
5
2
3
4
5
<?php
header('Content-Type: text/html; charset=UTF-8'); // force UTF-8
$test = mb_convert_encoding('<text uit API>', 'UTF-8', 'UTF-16'); // from UTF-16 to UTF-8
echo $test; // waffles
?>
header('Content-Type: text/html; charset=UTF-8'); // force UTF-8
$test = mb_convert_encoding('<text uit API>', 'UTF-8', 'UTF-16'); // from UTF-16 to UTF-8
echo $test; // waffles
?>
ik heb het gevonden: iconv('utf-16be', 'utf-8', rawurldecode($getvariable))