Toon posts:

speciale character problemen bij uitlezen gemounte schijf

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een applicatie waarbij ik bestandsnamen van een op een Linux PHP server gemounte Windows share moet weergeven en opslaan in een database. Dit werkt allemaal goed totdat er speciale characters in de bestandsnaam staan. Ik heb al rekening gehouden met de charset van de pagina, ik gebruik charset iso-8859-1.
Op het moment wordt bijvoorbeeld "β" een vierkantje op de pagina en een "á" in de broncode.

Op het moment lees ik de directory op deze manier uit:

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
//open de meegegeven directory
if ($handle = opendir($s_dir))
{
    //blijf inhoud lezen totdat er geen inhoud meer is.
    while (false !== ($file = readdir($handle)))
    {
        //controleer of het gevonden bestand niet "." is
        if($file !== '.')
        {
            //controleer of het gevonden bestand niet ".." is
            if($file !== '..')
            {
                //maak het padnaam compleet, het gevonden gedeelte word 
                //achter de map waarin hij is gevonden geplakt.
                $lok = $s_dir.'/'.$file;
                        
                //stop hem in de array.
                array_push($a_dirFindings, $lok);
            }
        }
    }
    //sluit de map
    closedir($handle);
}


Ik mount de schijf ook via php op deze manier:
PHP:
1
2
echo exec('mkdir /mnt/public');
echo exec('sudo mount -t cifs -o username=user, password=*** //192.168.0.3/public /mnt/public');


Op het moment dat ik nu $lok (padnaam) wil echo'en krijg ik het verkeerde speciale character te zien, of geen.
In de php manual wordt niks gezegd over speciale characters bij het gebruik van opendir() en readdir(). Het lijkt mij dat ik ergens een charset moet definieren maar ik weet zo niet waar.

Verwijderd

Topicstarter
Ik ben ondertussen verdergekomen. Heb een test string met meerdere speciale karakters gemaakt om vervolgens te kijken wat voor ouput ik krijg.

Hieronder de testresultaten
De bestandsnaam is "áäàâéëèêíïìîóöòôúüùûß TEST BESTAND.txt".

-Charset die ik gebruik
-functie die de string aanpast
-output

Charset utf-8
utf8_encode
" „…ƒ‚‰ÂŜˆ¡‹Œ¢”•“£—–á TEST BESTAND.txt"

Charset utf-8
utf8_decode
" „…ƒ‚‰Ŝˆ¡‹Œ¢”•“£—–á TEST BESTAND.txt"

Charset utf-8
-
" „…ƒ‚‰Ŝˆ¡‹Œ¢”•“£—–á TEST BESTAND.txt"

Charset iso-8859-1
utf8_encode
" „…ƒ‚‰ÂŜˆ¡‹Œ¢”•“£—–á TEST BESTAND.txt"

Charset iso-8859-1
utf8_decode
" „…ƒ‚‰Ŝˆ¡‹Œ¢”•“£—–á TEST BESTAND.txt"

Charset iso-8859-1
-
" „…ƒ‚‰Ŝˆ¡‹Œ¢”•“£—–á TEST BESTAND.txt"


Zoals duidelijk mag zijn maakt de charset die de website gebruikt in dit geval niks uit. Daarnaast levert de functie uft8_decode hetzelfde op als geen gebruik maken van een functie.

De string die de functie utf8_encode opleverd geeft een string terug die ik waarschijnlijk kan gebruiken. Ik ben nu van plan om alle characters te gaan vervangen met het character dat ze moeten zijn. De characters die worden weergegeven als &#129 zijn in volgorde: &.#141 en &.#129. Dit zie ik zojuist doordat de speciale characters worden omgezet bij "bekijk bericht" ^^.

Dit ga ik nu proberen, voor eventueel geinteresseerden zal ik een reply op deze post geven of het wel of niet werkt. Mocht er iemand zijn met een betere oplossing, laat het me weten :).

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

Moet je niet windows 1252 hebben ?

Dus $string = utf8_encode($string, 'windows-1252')

$string zou nu een utf_8 encoded string moeten zijn volgens mij.

/weet het niet zeker modus

Verstand van Voip? Ik heb een leuke baan voor je!


Verwijderd

Topicstarter
De functie utf8_encode() heeft als enigste parameter een string die je kan meegeven. De functie kan alleen ISO-8859-1 naar UTF-8 omzetten.
Bron

Doormiddel van utf8_encode() te gebruiken heb ik nu wel de speciale tekens omgezet naar meerdere tekens. á is bijvoorbeeld β.
Als ik nu het volgende uitvoer krijg ik het goede teken.
PHP:
1
$string = str_replace('á', 'ß', $string);


Dit werkt voor de meeste speciale karakters, alleen voor enkele niet, waaronder ï en ü. Aangezien ik de ü nogal nodig heb om bijvoorbeeld München weer te kunnen geven ga ik nog verder met een oplossing zoeken.

Verwijderd

Topicstarter
Ik heb zojuist een oplossing gevonden, mijn probleem is nu dan ook helemaal opgelost.

Mijn laatste probleem was dit. Hier is ? een character dat niet kan worden weergegeven. Dan is het niet mogelijk om ? te gebruiken in de str_replace() functie.

Werkt niet
PHP:
1
2
//Zet ü om naar het goede character
$string = str_replace('Â?', 'ü', $string);



Gelukkig is er een functie die een ascii int waarde omzet naar het ascii character. Als je deze gebruikt in de functie str_replace() dan kan het karakter wel worden gebruikt.

Werkt wel
PHP:
1
2
//Zet ü om naar het goede character
$string = str_replace('Â'.chr(129), 'ü', $string);


Het enigste wat je dan dus moet weten is de ascii int waarde.