[PHP/MSSQL] Vreemde karakters na parsen via commandline

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gegevens:
PHP 5.0.5
MSSQL 8.0

Ik heb een php mailscript die automatisch elke dag bepaalde gegevens mailt naar bepaalde personen. Het mailtje is in text/html iso-8859-1 (tenminste, dat is wat ik meegeef in de php mail() functie). Ik riep voorheen altijd dit script aan via de browser en plande de taak in het taakbeheer van windows. Wegens veiligheidredenen heb ik dit script buiten de IIS root gezet en roep het direct aan via de commandline (uitvoeren->cmd). Het automatisch aanroepen doe ik via een batchbestandje. In dit bestandje staat het volgende:
code:
1
c:\PHP\php-cgi.exe C:\opdrachtgevermailen.php >> test.htm

Het probleem:
Alle speciale karakters die uit de database worden gehaald (ë,é,è enz.), worden niet goed weergegeven (ik krijg karakters als Ù of %). Van de statische gegevens worden de speciale karakters wel goed weergegeven (tekst die ik direct in php echo). In zowel het mailtje die er gestuurd wordt, als de output test.htm, verschijnen de rare karakters.

In de php.ini staat de charset op iso-8859-1.
In de meta header die ik in php echo staat ook iso-8859-1.

Toch lijkt het dat de output in een verkeerde karakter tabel (charset) kijkt.

Weet iemand wat ik moet doen om dit te fixen?
Alvast bedankt

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

In PHP zet je je charset misschien wel goed, maar staat de charset van je database ook goed ingesteld? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • amiga1260
  • Registratie: Juni 2003
  • Laatst online: 21-08 16:39
De speciale tekens moet bijvoorbeeld é als é meegeven.

Het beste manier is:
addslashes() en stripslashes gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op donderdag 01 december 2005 @ 16:34:
In PHP zet je je charset misschien wel goed, maar staat de charset van je database ook goed ingesteld? :)
Maar waarom doet hij het wel goes als ik hem oproep via IIS met Internet Explorer?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat heeft addslashes met speciale tekens te maken? :?
Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
Dit is gewoon simpelweg een charset probleem. En é opgeven in plaats van é werkt wel, maar dat is eerder een workaround dan een oplossing. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op donderdag 01 december 2005 @ 16:34:
In PHP zet je je charset misschien wel goed, maar staat de charset van je database ook goed ingesteld? :)
Iemand enig idee waar ik de charset kan instellen van MSSQL?
In de enterprice manager kan ik het niet vinden...

Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-09 12:54
Verwijderd schreef op donderdag 01 december 2005 @ 16:53:
[...]


Iemand enig idee waar ik de charset kan instellen van MSSQL?
In de enterprice manager kan ik het niet vinden...
Je moet zoeken naar "collation". Je kunt het per field van een table instellen (bijvoorbeeld bij een CREATE TABLE statement), maar waarschijnlijk is er vast een instelling voor een default waarde.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar het vreemde is dat alles wel werkt met IIS / Internet explorer. Roep ik het aan via DOS (Windows commandline), dan gaat het pas fout bij het ophalen van de gegevens. Je zou dan toch zeggen dat de collation al goed zou moeten staan en dat er gegevens in DOS (om het zo maar even te noemen, ik weet dat het niet klopt) niet goed staan...

De collation staat standaard op latin1_general. Ik neem aan dat dit goed is.
De talen voor de rest:

PHP: geen standaard taal (charset) aangegeven in PHP.ini
Windows: Dutch, Nederland
MSSQL: Engels
Script: iso-8859-1

[ Voor 26% gewijzigd door Verwijderd op 02-12-2005 11:42 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het probleem is helaas nog steeds niet opgelost...
Iemand nog een idee?

[ Voor 100% gewijzigd door Verwijderd op 11-01-2006 16:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
schop..

Ik heb al wat meer informatie. Dit probleem doet zich alleen voor als:
- Er gegevens uit de database worden gehaald en deze gegevens bevatten karakters als é,à of ö.
- Er via de commandline php-cgi.exe wordt aangeroepen

Ik heb geprobeerd de variabelen om te zetten met de functie htmlentities(). Helaas pakt hij dit niet bij karakters als é,à,ü . Wel pakt hij deze functie bij bijvoorbeeld een quote '

ik heb dit testscriptje:
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
30
 
<?php
include_once("C:\automailtest\config.php");
    
    $testtable = "";
    
    $select     = "SELECT testnaam FROM testtable";
    $query      = mssql_query($select);
    while ($list = mssql_fetch_object($query)) {
        $testtable .= htmlentities($list->testnaam);
    }
    
    echo "$testtable<br>";
    
    $variabele  = "$testtable";
    $mailto     = "mail@mail.nl";
    $bcc        = "mail2@mail2.nl";
    $mailfrom   = "mailfrom@mail.nl";
    $onderwerp  = "Test gekke tekens";
    
    $mail_extra  = "MIME-Version: 1.0\r\n";
    $mail_extra .= "Content-type: text/html; charset=iso8859-1\r\n";
    $mail_extra .= "Content-Transfer-Encoding: 8bit\r\n";
    $mail_extra .= "From: mailer <".$mailfrom."> \r\n";
    $mail_extra .= "Reply-To: <mailreply@mail.nl> \r\n";
    $mail_extra .= "X-Priority: 1\r\n";
    $mail_extra .= "Date: ".date ("D, j M Y H:i:s 0")."\r\n";
    
    mail($mailto,$onderwerp,$variabele,$mail_extra);
?>

En het bat bestandje:
Batchfile:
1
2
c:\PHP\php-cgi.exe  C:\automailtest\testtekens.php
pause
In de database staat tëst tést tèst test
De output wordt t‰st t‚st tŜst test

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben weer wat verder:
Op http://www.weethet.nl/dutch/html_asciitable.php staat dat ascii 137 het promille teken is en op http://www.ascii.nl is 137 de é. Hij pakt het dus uit de verkeerde tabel. Iemand enig idee hoe ik dit verander?

Ik heb nu dit script gebruikt en het lijkt te werken:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<? 
function asciitoansi($string) { 
    $asciiarray[] = 142;    $ansiarray[] = 196; //    Ä     
    $asciiarray[] = 143;    $ansiarray[] = 197; //    Å     
    $asciiarray[] = 146;    $ansiarray[] = 198; //    Æ     
    $asciiarray[] = 128;    $ansiarray[] = 199; //    Ç     
    $asciiarray[] = 144;    $ansiarray[] = 201; //    É     
    $asciiarray[] = 165;    $ansiarray[] = 209; //    Ñ     
    $asciiarray[] = 153;    $ansiarray[] = 214; //    Ö     
    $asciiarray[] = 154;    $ansiarray[] = 220; //    Ü     
    $asciiarray[] = 133;    $ansiarray[] = 224; //    à     
    $asciiarray[] = 160;    $ansiarray[] = 225; //    á     
    $asciiarray[] = 131;    $ansiarray[] = 226; //    â     
    $asciiarray[] = 132;    $ansiarray[] = 227; //    ã     
    $asciiarray[] = 134;    $ansiarray[] = 229; //    å     
    $asciiarray[] = 145;    $ansiarray[] = 230; //    æ     
    $asciiarray[] = 135;    $ansiarray[] = 231; //    ç     
    $asciiarray[] = 138;    $ansiarray[] = 232; //    è     
    $asciiarray[] = 130;    $ansiarray[] = 233; //    é     
    $asciiarray[] = 136;    $ansiarray[] = 234; //    ê     
    $asciiarray[] = 137;    $ansiarray[] = 235; //    ë     
    $asciiarray[] = 141;    $ansiarray[] = 236; //    ì     
    $asciiarray[] = 161;    $ansiarray[] = 237; //    í     
    $asciiarray[] = 140;    $ansiarray[] = 238; //    î     
    $asciiarray[] = 139;    $ansiarray[] = 239; //    ï     
    $asciiarray[] = 164;    $ansiarray[] = 241; //    ñ     
    $asciiarray[] = 149;    $ansiarray[] = 242; //    ò     
    $asciiarray[] = 162;    $ansiarray[] = 243; //    ó     
    $asciiarray[] = 147;    $ansiarray[] = 244; //    ô     
    $asciiarray[] = 148;    $ansiarray[] = 246; //    ö     
    $asciiarray[] = 151;    $ansiarray[] = 249; //    ù     
    $asciiarray[] = 163;    $ansiarray[] = 250; //    ú     
    $asciiarray[] = 150;    $ansiarray[] = 251; //    û     
    $asciiarray[] = 129;    $ansiarray[] = 252; //    ü
    
    $i = 0; 
    while ($i < sizeof ($asciiarray)) 
        { 
        $string = str_replace(chr($asciiarray[$i]), chr($ansiarray[$i]), $string); 
        $i++; 
        } 
    return ($string); 
} 
?>


Ik zit alleen met het probleem van het euro teken? Iemand enig idee hoe ik dat om kan zetten van ascii naar ansi?

[ Voor 83% gewijzigd door Verwijderd op 01-02-2006 11:35 ]

Pagina: 1