Ik heb al mijn SMS'jes van mijn Nokia-telefoon opgeslagen op mijn pc. Het zijn allemaal losse bestandjes, met deze inhoud:
BEGIN:VMSG
VERSION:1.1
X-IRMC-STATUS:
X-IRMC-BOX:INBOX
X-NOK-DT:20080624T221242Z
X-MESSAGE-TYPE:DELIVER
BEGIN:VCARD
VERSION:3.0
N:
TEL:+*****
END:VCARD
BEGIN:VENV
BEGIN:VBODY
Date:24.06.2008 22:12:42
U heeft 1 gemiste oproep van +*****.
Laatste oproep:24/06/08, 23:16 uur.
Dit is een gratis sms van T-Mobile, zie www.t-mobile.nl/gemisteoproepsms.
END:VBODY
END:VENV
END:VMSG


Nu wil ik deze sms'jes in een database stoppen met PHP. Ik krijg bij het openen met file(); echter allerlei rare tekens. Ook als ik het bestand gewoon i in de browser open, heb ik dat probleem.
B�E�G�I�N�:�V�M�S�G�
�V�E�R�S�I�O�N�:�1�.�1�

Weet iemand hoe ik die rare tekens tussendoor kan voorkomen?
Ik heb geen idee waar het vandaan komt.
Maar als je � weghaalt hou je de gewone tekst over.
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

$array = array('B&#65533;E&#65533;G&#65533;I&#65533;N&#65533;:&#65533;V&#65533;M&#65533;S&#65533;G&#65533;',
'&#65533;V&#65533;E&#65533;R&#65533;S&#65533;I&#65533;O&#65533;N&#65533;:&#65533;1&#65533;.&#65533;1&#65533;');

foreach($array as $value)
{
echo str_replace('&#65533;', '', $value) . '<br />';
}

?>
Output:

BEGIN:VMSG
VERSION:1.1
Klopt, het gekke is alleen dat de browser (FF3.5 in mijn geval) niet &#65533 laat zien, maar een vierkant blokje met een vraagteken erin.

En het is eigenlijk symptoombestrijding natuurlijk, en dat heb ik liever niet ;).
&#65533; zou een character moeten zijn. Als dat onbekend is wordt er inderdaad een blokje neergezet.
Maar waarom staat dat character er dan? In het originele bestand (open in kladblok) zit dat er niet.
Geen idee.
Kan je eens zo'n bestandje onbewerkt ergens uploaden? Het zou zomaar kunnen dat het bestandje een andere charset gebruikt. Normaal zijn alle karakters 1 byte (8 ééntjes en nulletjes) lang, maar omdat je dan maar een heel klein aantal verschillende tekens kan gebruiken, zijn er in de loop der jaren heel wat charsets bijgekomen. Als het bestandje een charset gebruikt die ieder karakter 2 bytes geeft, en je browser heeft dat niet door, en denkt dat die 2e byte een nieuw karakter is (of PHP heeft het niet door, hoe verstuur je die bestanden eigenlijk naar de browser? Haal je ze eerst door htmlentities o.i.d. heen?) dan zou je zoiets kunnen krijgen.
Volgens internet is het UTF-16LE, en inderdaad, als je het met [php]iconv[/php] omzet naar UTF-8 ben je die vreemde karakters kwijt.
<?php
$data = file_get_contents('31235391210_2008-06-25.vmg');

echo iconv('utf-16LE', 'utf-8', $data);
?>

Reageren