ACSII -> plaintext
Goeiedag,
Al maanden ben ik bezig om allerlei muziekdata te verzamelen. Nu wil ik een stap verder gaan maar loop ik tegen beperkingen van een oud systeem, met ASCII aan.
Aan de hand van wat voorbeelden wordt het probleem hopelijk duidelijk.
Het pad moet zijn: E:\Otsfiles\10\2010\Akon - Angel.ots. Resultaat: E:\Otsfiles�0\Akon - Angel.ots.
E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots -> E:\Otsfiles\80983\Agnetha Fältskog - The Heat Is On.ots
Speciale letters, zoals ä, pak ik nog aan.
Met $str = str_replace("\x01", "\\1", $str); krijg ik: E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots. Prima. Dit krijg ik echter niet voor alle platen werkend. Is er een manier om dit beter maar vooral zo te maken dat het altijd werkt?
Alvast bedankt voor het meedenken.
Al maanden ben ik bezig om allerlei muziekdata te verzamelen. Nu wil ik een stap verder gaan maar loop ik tegen beperkingen van een oud systeem, met ASCII aan.
Aan de hand van wat voorbeelden wordt het probleem hopelijk duidelijk.
Het pad moet zijn: E:\Otsfiles\10\2010\Akon - Angel.ots. Resultaat: E:\Otsfiles�0\Akon - Angel.ots.
E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots -> E:\Otsfiles\80983\Agnetha Fältskog - The Heat Is On.ots
Speciale letters, zoals ä, pak ik nog aan.
Met $str = str_replace("\x01", "\\1", $str); krijg ik: E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots. Prima. Dit krijg ik echter niet voor alle platen werkend. Is er een manier om dit beter maar vooral zo te maken dat het altijd werkt?
Alvast bedankt voor het meedenken.
Kan je niet zoiets proberen?
$str = preg_replace('/[\x00-\x1F]/', '\\', $str);
$str = preg_replace('/[\x00-\x1F]/', '\\', $str);
Bedankt voor het meedenken Ariën.
Met preg_replace() ben ik al bezig geweest en ook dit heeft niet helemaal het gewenste effect. Waar ik niet uitkom is wat nou het verschil zou kunnen zijn in onderstaande output.
E:\Otsfiles\60\1965\The Beatles - Day Tripper.ots -> E:\Otsfiles0\1965\The Beatles - Day Tripper.ots
E:\Otsfiles\70\1978\ABBA - Eagle.ots -> E:\Otsfiles8\1978\ABBA - Eagle.ots
E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots -> E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots.
E:\Otsfiles\80\1982\Al Jarreau - Roof Garden.ots -> E:\Otsfiles\80\1982\Al Jarreau - Roof Garden.ots
E:\Otsfiles\90\1992\Izabella - Shame Shame Shame.ots -> E:\Otsfiles\90\1992\Izabella - Shame Shame Shame.ots
E:\Otsfiles\00\2001\16 Down - Subtle Movements.ots -> E:\Otsfiles\0?1\ Down - Subtle Movements.ots
E:\Otsfiles\10\2010\Akon - Angel.ots -> E:\Otsfiles\80\Akon - Angel.ots
E:\Otsfiles\20\2020\5 Seconds Of Summer - Wildflower.ots -> E:\Otsfiles\?0\5 Seconds Of Summer - Wildflower.ots
Deze jaren 80, 90 zijn wel goed. De rest niet. Het is me niet helemaal duidelijk waar het verschil precies in zit.
Dit is de code.
$strorg = "E:\Otsfiles\20\2020\5 Seconds Of Summer - Wildflower.ots";
$str = str_replace("\x01", "\\1", $strorg);
$str = str_replace("\x02", "\\2", $str);
$str = str_replace("\x03", "\\3", $str);
$str = str_replace("\x04", "\\4", $str);
$str = str_replace("\x05", "\\5", $str);
$str = str_replace("\x06", "\\6", $str);
$str = str_replace("\x07", "\\7", $str);
$str = str_replace("\x08", "\\8", $str);
$str = str_replace("\x09", "\\9", $str);
$str = str_replace("\x00", "\\0", $str);
$str = preg_replace('/[\x00-\x1F]/', '\\', $str);
$str = utf8_encode($str);
echo "$str";
Met preg_replace() ben ik al bezig geweest en ook dit heeft niet helemaal het gewenste effect. Waar ik niet uitkom is wat nou het verschil zou kunnen zijn in onderstaande output.
E:\Otsfiles\60\1965\The Beatles - Day Tripper.ots -> E:\Otsfiles0\1965\The Beatles - Day Tripper.ots
E:\Otsfiles\70\1978\ABBA - Eagle.ots -> E:\Otsfiles8\1978\ABBA - Eagle.ots
E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots -> E:\Otsfiles\80\1983\Agnetha Fältskog - The Heat Is On.ots.
E:\Otsfiles\80\1982\Al Jarreau - Roof Garden.ots -> E:\Otsfiles\80\1982\Al Jarreau - Roof Garden.ots
E:\Otsfiles\90\1992\Izabella - Shame Shame Shame.ots -> E:\Otsfiles\90\1992\Izabella - Shame Shame Shame.ots
E:\Otsfiles\00\2001\16 Down - Subtle Movements.ots -> E:\Otsfiles\0?1\ Down - Subtle Movements.ots
E:\Otsfiles\10\2010\Akon - Angel.ots -> E:\Otsfiles\80\Akon - Angel.ots
E:\Otsfiles\20\2020\5 Seconds Of Summer - Wildflower.ots -> E:\Otsfiles\?0\5 Seconds Of Summer - Wildflower.ots
Deze jaren 80, 90 zijn wel goed. De rest niet. Het is me niet helemaal duidelijk waar het verschil precies in zit.
Dit is de code.
$strorg = "E:\Otsfiles\20\2020\5 Seconds Of Summer - Wildflower.ots";
$str = str_replace("\x01", "\\1", $strorg);
$str = str_replace("\x02", "\\2", $str);
$str = str_replace("\x03", "\\3", $str);
$str = str_replace("\x04", "\\4", $str);
$str = str_replace("\x05", "\\5", $str);
$str = str_replace("\x06", "\\6", $str);
$str = str_replace("\x07", "\\7", $str);
$str = str_replace("\x08", "\\8", $str);
$str = str_replace("\x09", "\\9", $str);
$str = str_replace("\x00", "\\0", $str);
$str = preg_replace('/[\x00-\x1F]/', '\\', $str);
$str = utf8_encode($str);
echo "$str";
Gewijzigd op 10/03/2026 13:50:52 door Martijn Savelkouls
In welke stap gaat dit mis?
Weergeven op scherm, wegschrijven in db?
mis je niet ergens een addslashes()?
Want wat maakt nu dat sommige sequences van \ + laag cijfer tot rare tekens leidt?
Pas je het niet op een te laat tijdstip in het proces aan?
Weergeven op scherm, wegschrijven in db?
mis je niet ergens een addslashes()?
Want wat maakt nu dat sommige sequences van \ + laag cijfer tot rare tekens leidt?
Pas je het niet op een te laat tijdstip in het proces aan?
Wegschrijven naar een db is nu niet aan de orde. Deze data komt uit een programma, dat het daarin goed weergeeft maar bij verwerking gaat het mis.
Met addslashes(), en de andere, gewerkt. Krijg daarmee ook niet het gewenste resultaat.
De paden moeten uiteraard kloppen om muziek te aan draaien en je zou denken dat het niet zo lastig zou zijn... maar ja, nooit is iets wat het lijkt.
Bij 5 Seconds Of Summer - E:\Otsfiles\20\2020\5 Seconds Of Summer - Wildflower.ots zie ik wel als ik een fout maak: addcslashes('E:\\Otsfiles\\\xC2\x820...').
Daar zit het probleem, Het lijkt een omzetting van ASCII naar utf-8. Maar ja, meer dan dit zie ik weer niet.
Met addslashes(), en de andere, gewerkt. Krijg daarmee ook niet het gewenste resultaat.
De paden moeten uiteraard kloppen om muziek te aan draaien en je zou denken dat het niet zo lastig zou zijn... maar ja, nooit is iets wat het lijkt.
Bij 5 Seconds Of Summer - E:\Otsfiles\20\2020\5 Seconds Of Summer - Wildflower.ots zie ik wel als ik een fout maak: addcslashes('E:\\Otsfiles\\\xC2\x820...').
Daar zit het probleem, Het lijkt een omzetting van ASCII naar utf-8. Maar ja, meer dan dit zie ik weer niet.
Gewijzigd op 10/03/2026 15:32:37 door Martijn Savelkouls
Ik mis een beetje wat de toepassing van addCslashes() hier is. Ik heb die functie nog nooit gebruikt. Wel zou ik addslashes() kunnen begrijpen, als je last hebt van de \ in bijvoorbeeld "c:\Windows"
Maar doe eens een stap terug.
- Er is een applicatie die een string / path oplevert.
- Wat staat er in die string?
- Waarom is die string niet geschikt?
- Welk deel veroorzaakt een probleem en welke oplossing heb je gekozen om dat op te lossen?
Dat je nu problemen hebt met een "simpele" /01/2022/ in je path lijkt me voort te komen uit een foute oplossing.
een ä in een naam lijkt me eerder een probleem dat je op moest lossen. Vandaar dat ik denk dat je gekozen oplossing niet het probleem oplost of juist een extra probleem veroorzaakt.
Sowieso vind ik bestandsnamen met dergelijke tekens niet handig, maar dat zal een gepasseerd station zijn.
Toevoeging op 11/03/2026 12:25:10:
hoeveel eenvoudiger wordt het als je / gebruikt in de string die het path bevat:
c:/data/ zou volgens mij ook werken:
$path = str_replace('\\', '/', $path);
Maar doe eens een stap terug.
- Er is een applicatie die een string / path oplevert.
- Wat staat er in die string?
- Waarom is die string niet geschikt?
- Welk deel veroorzaakt een probleem en welke oplossing heb je gekozen om dat op te lossen?
Dat je nu problemen hebt met een "simpele" /01/2022/ in je path lijkt me voort te komen uit een foute oplossing.
een ä in een naam lijkt me eerder een probleem dat je op moest lossen. Vandaar dat ik denk dat je gekozen oplossing niet het probleem oplost of juist een extra probleem veroorzaakt.
Sowieso vind ik bestandsnamen met dergelijke tekens niet handig, maar dat zal een gepasseerd station zijn.
Toevoeging op 11/03/2026 12:25:10:
hoeveel eenvoudiger wordt het als je / gebruikt in de string die het path bevat:
c:/data/ zou volgens mij ook werken:
$path = str_replace('\\', '/', $path);
Goedemorgen Ivo,
Bedankt voor de reactie.
addslashes() voegt hier niet zoveel toe, het geeft alleen aan dat er meer onderliggende problemen zijn (addcslashes('E:\\Otsfiles\\\xC2\x820...').).
Dat programma laat een direct pad naar het muzieknummer zien. Die neem ik over met control c - control v. Blijkbaar zit in dit pad ASCII want normaal zou het bovenstaande voorbeeld, de string, geen probleem moeten zijn. Echter krijg ik nu dus allerlei rare resultaten.
Het gaat om zo'n 250GB aan muziek dat op een externe schijf staat, vandaar de letter E. Via systeem instellingen is aan te passen dat de webserver wel makkelijker met andere schijven kan werken. Dat moet ik weer even uitzoeken maar dat zou kunnen wanneer je de server laat draaien als 'service', of zoiets. Dat kan in elk geval wel. Dit heb ik eerder gedaan.
Bedankt voor de reactie.
addslashes() voegt hier niet zoveel toe, het geeft alleen aan dat er meer onderliggende problemen zijn (addcslashes('E:\\Otsfiles\\\xC2\x820...').).
Dat programma laat een direct pad naar het muzieknummer zien. Die neem ik over met control c - control v. Blijkbaar zit in dit pad ASCII want normaal zou het bovenstaande voorbeeld, de string, geen probleem moeten zijn. Echter krijg ik nu dus allerlei rare resultaten.
Het gaat om zo'n 250GB aan muziek dat op een externe schijf staat, vandaar de letter E. Via systeem instellingen is aan te passen dat de webserver wel makkelijker met andere schijven kan werken. Dat moet ik weer even uitzoeken maar dat zou kunnen wanneer je de server laat draaien als 'service', of zoiets. Dat kan in elk geval wel. Dit heb ik eerder gedaan.
Gewijzigd op 12/03/2026 06:36:32 door Martijn Savelkouls
Maar ik neem aan dat op het moment van paste-n de tekst er nog goed uitziet.
Wáár wordt dit verhaspeld?
Welke functies zijn erop losgelaten.
addcslashes zet bijna overal backslashes voor. Waar heb je dat voor nodig?
Aangenomen dat je het paste in <input name="path">
Wat zit er dan na posten in $_POST['path']?
Wáár wordt dit verhaspeld?
Welke functies zijn erop losgelaten.
addcslashes zet bijna overal backslashes voor. Waar heb je dat voor nodig?
Aangenomen dat je het paste in <input name="path">
Wat zit er dan na posten in $_POST['path']?
Ik vermoed dat het in ascii 128-255 zit.
Over de \1 en \2, dat zijn octal escapes.
Dat kan je oplossen met de str_replace() zoals eerder door Ivo genoemd.
Als je (bij het testen) het path hardcoded als string in je code hebt staan, zet het dan tussen enkele aanhalingstekens
Code (php)
1
2
2
$enc = mb_detect_encoding($path, ['UTF-8', 'CP1252', 'ISO-8859-1'], true);
$path = mb_convert_encoding($path, 'UTF-8', $enc ?: 'CP1252');
$path = mb_convert_encoding($path, 'UTF-8', $enc ?: 'CP1252');
Over de \1 en \2, dat zijn octal escapes.
Dat kan je oplossen met de str_replace() zoals eerder door Ivo genoemd.
Als je (bij het testen) het path hardcoded als string in je code hebt staan, zet het dan tussen enkele aanhalingstekens
Gewijzigd op 12/03/2026 13:33:19 door Ron Kr.
Maar als het ascii zou zijn, dan zijn dat al vooral basis tekens. De ä zou nog voor rare effecten kunnen zorgen, maar de conversie van \1 naar rare tekens komt toch echt ergens vandaan.
Ik zou daar naar gaan zoeken door stap voor stap te debuggen:
- wat zit in $_POST
- wat doe je er mee en wat is dan per stap het nieuwe resultaat
en dus elke stap of naar het scherm sturen, of met Xdebug volgen wat er gebeurt. "Iets" zorgt voor die omzetting. En ik zou niet kiezen voor een oplossing waarbij je dat weer terugdraait, maar voorkomen dat dat gebeurt.
Ik zou daar naar gaan zoeken door stap voor stap te debuggen:
- wat zit in $_POST
- wat doe je er mee en wat is dan per stap het nieuwe resultaat
en dus elke stap of naar het scherm sturen, of met Xdebug volgen wat er gebeurt. "Iets" zorgt voor die omzetting. En ik zou niet kiezen voor een oplossing waarbij je dat weer terugdraait, maar voorkomen dat dat gebeurt.




