Hallo,

Ik heb een site waar gebruikers TXT bestanden kunnen uploaden. De inhoud van deze bestanden worden dan in binary naar een php pagina gestuurd waar deze verwerkt wordt en aan de hand van deze gegevens word het formulier ingevuld.

Nadien gaat de inhoud van dit formulier de databank in en kan er op de website worden gezocht naar andere TXT bestanden en indien nodig gedownload.

Nu is het probleem dat het bestand dat ze downloaden altijd UTF-8 moet zijn, ik heb zelf al verschillende bestanden gedownload en regelmatig zitten er rare tekens tussen de tekst waardoor ik vermoed dat dit een encode probleem is.

Ik was aan het denken om de SETTERS van mijn TXT object aan te passen dat dit alles omzet naar UTF8 maar ik kan niet vooraf zeggen wat de input encode gaat zijn. Hier zit ik vast, ik heb op het internet al zitten zoeken en geprobeerd met de utf8 encode functie van php, iconf (ofzo) maar dan blijft de output regelmatig leeg of bevat deze nog meer problemen.

Mijn databank staat in (collatie) utf8mb4_unicode_ci

Alvast prettige feestdagen, en bedankt voor je tijd.
Mvg.
Als je niet weet wat de encoding is van de input, weet je eigenlijk helemaal niet wat er opgestuurd wordt. Als iemand een plaatje in JPG opstuurt, behandelt jouw programma het nog als unicode tekst. Je hebt meer controle nodig. Ik ga er gemakshalve van uit dat je dit al gelezen hebt: https://www.phphulp.nl/php/tutorial/php-algemeen/unicode-enzo/831/

Een oplossing zou kunnen zijn om van de uploader te eisen dat het een unicode TXT-bestand moet zijn, dat begint met een Byte Order Mark (BOM). Je kunt dan het opgestuurde bestand valideren door te kijken of het met een BOM begint.

Een tweede idee is om de fileinfo-extentie te gebruiken, die aan de hand van een aantal algoritmes probeert te bepalen of de inhoud van het bestand een tekstbestand is. Je kunt dit eventueel gebruiken met de vorige suggestie:

<?php
  if (2 < strlen($bestandsinhoud) and "\xEF\xBB\xBF" === substr($bestandsinhoud, 0, 3)) {
    // bestand begint in UTF-8 met een Byte Order Mark
  }
  if ('text/plain' === mime_content_type($bestandslocatie)) {
    // bestand is door FileInfo gedetermineerd, en zal een tekstbestand zijn
  }
?>


Details:
- https://simple.wikipedia.org/wiki/Byte_order_mark
- https://www.php.net/manual/en/function.mime-content-type.php

Reageren