Allen,
Ik zit met een probleem waar ik al een hele ochtend mee bezig ben en inmiddels de bomen niet meer kan zien door het bos. Het gaat, in het kort, om een PHP-script dat uiteindelijk een dir doorloopt en alle files die erin staan uitleest en de inhoud ervan in een database propt. De bestanden in die dir zijn SMS-berichten die ik via Nokia PC Suite uit mijn telefoon heb gehaald. Dat programma maakt .vmg-bestanden aan maar zijn feitelijk plain-text; zij het in een bepaalde characterset/codering. En daar begint het probleem.
Allereerst het txt-file; dat is gewoon het .vmg bestand hernoemd naar .txt. De inhoud van het bericht wordt in Notepad goed weergegeven, alleen de newlines worden door []-hokjes vervangen. De TXT staat hier: http://schellevis.org/sms/Testbericht.txt (Save as...)
Dan nu PHP: wanneer ik de inhoud van het bestand uitlees en in een variabele plak gaat dit allemaal goed, de verdere verwerking van de string echter niet. Het probleem is dat er tussen elk teken in het bestand een soort 'spatie' of ander teken staat waardoor een str_replace op 'testbericht' bijvoorbeeld niets oplevert. Als je de source in IE bekijkt maakt hij er ook het volgende van:
De gewone output die je in IE ziet is echter wél goed leesbaar, daar zie je niks aan af: http://schellevis.org/readsms.php
Nu heb ik al veel uitgezocht en ik weet dat ik het in de hoek van Unicode/charset achtige dingen moet zoeken. Namelijk:
- Wanneer ik de .txt in Word probeer te openen vraagt hij welke encoding het is: alléén bij 'Unicode' (dus geen UTF-8) laat Word het bericht goed zien, bij elke andere encoding zet Word er ook [] tussen.
- Wanneer ik met mb_detect_encoding de uitgelezen .txt analyseer zegt hij dat het ASCII is
- Wanneer ik de platte tekst (zoals IE output) hard als value in mijn script plak werkt mijn verwerking van de string wél
- Wanneer ik een Windows-tooltje gebruik om de codering naar UTF-8 te converteren van ISO-8859-1 dan krijg ik netjes de goede tekst
- Wanneer ik het .txt-bestand open en opnieuw opsla als .txt krijg ik ook een goede tekst
- unicode_encode en _decode zijn experimental in PHP, met utf8_encode en _decode kan ik volgens mij niks
Kort samengevat kan ik dus concluderen dat het in Unicode (niet UTF-8 of -16) of een andere vage codering is die PHP niet kan verwerken. Dit kan ik handmatig aanpassen, het doel is juist om dit geautomatiseerd te kunnen. Is er iemand die een idee heeft hoe ik deze string met PHP kan converteren naar een gewone UTF-8 codering? Of hoe ik erachter kan komen wat voor teken het is en hoe ik deze eruit kan slopen? Alvast heel erg bedankt!
Voor de volledigheid de PHP-code, waarbij ik vooralsnog maar één ding met die string wil: exploden bij 'X-NOK-DT'. Omdat hij dat deel niet kan vinden (de string bevat namelijk eigenlijk iets als 'X - N O K - D T') zet hij de hele string onder de eerste value van het array.
Ik zit met een probleem waar ik al een hele ochtend mee bezig ben en inmiddels de bomen niet meer kan zien door het bos. Het gaat, in het kort, om een PHP-script dat uiteindelijk een dir doorloopt en alle files die erin staan uitleest en de inhoud ervan in een database propt. De bestanden in die dir zijn SMS-berichten die ik via Nokia PC Suite uit mijn telefoon heb gehaald. Dat programma maakt .vmg-bestanden aan maar zijn feitelijk plain-text; zij het in een bepaalde characterset/codering. En daar begint het probleem.
Allereerst het txt-file; dat is gewoon het .vmg bestand hernoemd naar .txt. De inhoud van het bericht wordt in Notepad goed weergegeven, alleen de newlines worden door []-hokjes vervangen. De TXT staat hier: http://schellevis.org/sms/Testbericht.txt (Save as...)
Dan nu PHP: wanneer ik de inhoud van het bestand uitlees en in een variabele plak gaat dit allemaal goed, de verdere verwerking van de string echter niet. Het probleem is dat er tussen elk teken in het bestand een soort 'spatie' of ander teken staat waardoor een str_replace op 'testbericht' bijvoorbeeld niets oplevert. Als je de source in IE bekijkt maakt hij er ook het volgende van:
code:
1
| T e s t b e r i c h t |
De gewone output die je in IE ziet is echter wél goed leesbaar, daar zie je niks aan af: http://schellevis.org/readsms.php
Nu heb ik al veel uitgezocht en ik weet dat ik het in de hoek van Unicode/charset achtige dingen moet zoeken. Namelijk:
- Wanneer ik de .txt in Word probeer te openen vraagt hij welke encoding het is: alléén bij 'Unicode' (dus geen UTF-8) laat Word het bericht goed zien, bij elke andere encoding zet Word er ook [] tussen.
- Wanneer ik met mb_detect_encoding de uitgelezen .txt analyseer zegt hij dat het ASCII is
- Wanneer ik de platte tekst (zoals IE output) hard als value in mijn script plak werkt mijn verwerking van de string wél
- Wanneer ik een Windows-tooltje gebruik om de codering naar UTF-8 te converteren van ISO-8859-1 dan krijg ik netjes de goede tekst
- Wanneer ik het .txt-bestand open en opnieuw opsla als .txt krijg ik ook een goede tekst
- unicode_encode en _decode zijn experimental in PHP, met utf8_encode en _decode kan ik volgens mij niks
Kort samengevat kan ik dus concluderen dat het in Unicode (niet UTF-8 of -16) of een andere vage codering is die PHP niet kan verwerken. Dit kan ik handmatig aanpassen, het doel is juist om dit geautomatiseerd te kunnen. Is er iemand die een idee heeft hoe ik deze string met PHP kan converteren naar een gewone UTF-8 codering? Of hoe ik erachter kan komen wat voor teken het is en hoe ik deze eruit kan slopen? Alvast heel erg bedankt!
Voor de volledigheid de PHP-code, waarbij ik vooralsnog maar één ding met die string wil: exploden bij 'X-NOK-DT'. Omdat hij dat deel niet kan vinden (de string bevat namelijk eigenlijk iets als 'X - N O K - D T') zet hij de hele string onder de eerste value van het array.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| <?php $dir_handle = opendir($sms_dir); while ($file_name = readdir($dir_handle)) { if ($file_name != "." && $file_name != "..") { $file_path = $sms_dir . $file_name; $file_handle = fopen($file_path, 'rw'); $string = fread($file_handle, filesize($file_path)); fclose($file_handle); $explode = explode('X-NOK-DT',$string); print_r($explode); echo "<BR>"; } } closedir($dir_handle); ?> |