[PHP] Probleempje met utf-8 encoding

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer via een PHP script via het internet en een betaalde SMS gateway SMSjes te versturen. Hiervoor heb ik:

- bij BigFoot een account en daar krijg je toegang tot hun SMS gateway. Voor de programmering hebben ze de richtlijnen van hun API bijgevoegd.

- de stappen in deze API zijn kort:
  • 2.1. CONNECTING TO THE BIGFOOT SMS GATEWAY SERVER The client should send HTTP POST form requests to the gateway (Bigfoot SMS Server) and wait for the gateway's response. The following URLs are used to connect with the gateway:
    http://smsgateway.bigfoot.com:8080/services/smsgateway for sending message
    and
    http://smsgateway.bigfoot.com:8080/services/originator for requesting the validity of originator number.
    Connections should be made to the symbolic DNS of the gateway, instead of the IP address because the IP address of the gateway is subject to change without prior notice.
  • 2.2. TRANSMITTING SUBMISSIONS TO THE BIGFOOT SMS GATEWAY SERVER The client should transmit submissions by HTTP POST request to the gateway. It is also the client's responsibility to compose the request. Submissions sent to the gateway should conform to Sections 2.2.1 and 2.2.2, as well as RFC 2616.
  • 2.2.1. HTTP Sequence 1.
    Client should connect to the gateway (see section 2.1 for URLs).
    2.
    Client then transmits the HTTP POST request. The request URI for sending SMS is: /services/smsgateway
    The request URI for validating the originator number is: /services/originator
    Requests should contain the following HTTP headers:
    Content-type: application/x-www-form-urlencoded
    Accept-charset: utf-8
    Content-length: xxx (where xxx is the length of the body)
    The definitions and values of the attributes of the HTTP POST request body should conform to Section 2.2.2
    The client should not close the connection after the transmitting request in order to receive a reply from the gateway (see section 2.3).
  • 2.2.3. Text Messages The ETSI GSM 03.38 character set encodes characters intended for display in the Text Message. Characters in the Text Message are therefore limited only to those available in that particular character set. Please go to this URL to see other existing character sets for encoding: http://www.unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT
    For the other mobile service carriers and other types of mobile phones employing the other existing character sets, Bigfoot cannot guarantee that the text message will send or display correctly. This is because Bigfoot cannot configure the specific transmission and display capabilities for all the different types of mobile phones in the world. However, most mobile service carriers and mobile phones of various make and model - except for those used in the United States - are capable of transmitting and displaying ETSI GSM 03.38 characters.
- een formulier (.html) bestand:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form action="sms.php" method="post" enctype="multipart/form-data">
<input name="username" type="text" value="mijnusername">
<input name="password" type="text" value="mijnwachtwoord">
<input name="test_mode" type="text" value="no">
<input name="type" type="text" value="text">
<input name="text" type="text" value="Dit is een test om te kijken of het werkt!">
<input name="numbers" type="text" value="+31612345678">
<input name="originator" type="text" value="DJKevin2K">
<input name="version" type="text" value="1.0">
<input name="submit" type="submit" value="submit">
</form>
</body>
</html>


- een php file waarnaar gepost wordt door het formulier:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
foreach ($_POST as $key => $value) { 
    $value = urlencode(stripslashes($value)); 
    $req .= "&$key=$value";
}

$header .= "POST /services/smsgateway HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Accept-charset: utf-8\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

$fp = fsockopen ("smsgateway.bigfoot.com", 8080);

if (!$fp) {
    echo "error ". $req;
} else {
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
        $res = fgets ($fp, 1024);
    }
    fclose ($fp);
}


Met bovenstaand script krijg ik de gegevens verzonden naar de gateway, en ontvang niet veel later ook een SMS, maar hierbij is:
- de naam van de afzender slechts gedeeltelijk ontvangen (DJKevin2U);
- het bericht in rare tekentjes weergegeven;

Ik vermoed dat er iets in het PHP script niet klopt met betrekking tot de coding of iets dergelijks. Ik heb de variabelen uitgelezen en deze bevatten allen de juiste informatie.

kan iemand mij helpen?

Acties:
  • 0 Henk 'm!

Verwijderd

wel, je html form stuurt US-ASCII naar je server, php krijgt al je _POST vars binnen als us-ascii, maar in je request naar de sms server zeg je dat het om utf-8 gaat. dus die sms server pakt (denk ik) steeds 2 characters van jouw string, en interpreteert die als 1 utf-8 character.

als mijn redenering klopt dan zou jij een sms bericht ontvangen dat de helft van de lengte is van wat je in het form hebt getypt.

_hopelijk_ oplossing: gebruik de mbstring functies van PHP (multibyte).

:?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat begrijp ik deels, want van de hele serie vars die naar de SMS server worden gezonden, ontvangt hij wel het telefoonnummer en de overige instellingen op de juiste manier, immers, ik krijg een SMS terug, echter de berichttekst wordt geheel verkeerd weergegeven en van de afzender het laatste teken.

Je bedoelt dus dat ik het HTML form reeds utf-8 moet laten posten op het PHP script. Ik zal het eens proberen.

Acties:
  • 0 Henk 'm!

Verwijderd

ja probeer dat eens, en output ook al die $_POST data naar je scherm, zodat je kunt zien wat voor characters er naar de sms server worden gestuurd.
ik had een soortgelijk probeer met unicode ondersteuning voor een soort CMS systeem. (topic 760114 weet niet hoe je die link maakt). toen ik forms postte als utf-8 kreeg ik in PHP steeds 2 chars binnen voor een unicode char.

voor in de html moet je dus zoiets schrijven als
code:
1
<form accept-charset="utf-8" ......>

als ik me niet vergis tenminste, anders kijk je gewoon op de site www.w3c.com om te zien wat geldige charsets zijn voor de form-tag.

er bestaat ook nog zoiets als accept-charset in php.ini, maar daar ben ik niet mee bezig geweest, mij te ingewikkeld. :P

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Een charset opgeven in het form lukt niet, wel in de meta-tags van het form, dit heb ik ook gedaan, maar zonder success. De string die naar de gateway wordt gezonden met bovenstaand voorbeeld is:

&username=mijnusername&password=mijnwachtwoord&test_mode=no&type=text&text=Dit+is+een+test+om+te+kijken+of+het+werkt%21&numbers=%2B31612345678&originator=DJKevin2K&version=1.0&submit=submit

Het resultaat is een ontvangen SMS op het juiste nummer, met als afzender DJKevin2U en een bericht van:

C$eNèæåSSp…LÜæ åsQ…è.-7É';A<æ…-å¥CÖ†D?o?A Cù Ŝ4ö(=$¥ Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù ŜAø ü N£i§gdžà¥ß£R? ‚ÆN0¿F

Dus niet echt dat je zegt 2 keer zo kort...

Acties:
  • 0 Henk 'm!

Verwijderd

1. UTF-8 is niet alijd 2 bytes, het kan ook 1 of 3 bytes zijn :)
2. Misschien is het het handigst om PHP de string naar UTF-8 te laten cenverteren voordat je hem doorstuurt? Dus niet in de HTML zitten klooien, maar (ik weet verder nix van PHP, maar wel van UTF8) zoiets als byte[] = encodeUTF8("deze moet utf-8 worden") ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm, vaagjes, als ik
PHP:
1
echo utf8_encode('test');

doe, krijg ik als resultaat gewoon
code:
1
test

te zien. Dit kan toch niet kloppen he?

[ Voor 6% gewijzigd door Verwijderd op 29-05-2003 08:15 ]


Acties:
  • 0 Henk 'm!

  • Glock
  • Registratie: November 2001
  • Niet online
sjow, server spoort weer :+

utf8 encode alleen speciale characters zoals Ä ü etc. dus wat jij bij test kreeg is vrij normaal :)

[ Voor 151% gewijzigd door Glock op 29-05-2003 09:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

offtopic:
Mischien kan je bigfoot vragen of ze een demo kunnen sturen ben je er meteen uit.

Acties:
  • 0 Henk 'm!

  • Robinski
  • Registratie: September 2000
  • Laatst online: 12-07 19:39

Robinski

A.K.A. RHarmsen

Verwijderd schreef op 28 May 2003 @ 18:40:
Een charset opgeven in het form lukt niet, wel in de meta-tags van het form, dit heb ik ook gedaan, maar zonder success. De string die naar de gateway wordt gezonden met bovenstaand voorbeeld is:

&username=mijnusername&password=mijnwachtwoord&test_mode=no&type=text&text=Dit+is+een+test+om+te+kijken+of+het+werkt%21&numbers=%2B31612345678&originator=DJKevin2K&version=1.0&submit=submit

Het resultaat is een ontvangen SMS op het juiste nummer, met als afzender DJKevin2U en een bericht van:

C$eNèæåSSp…LÜæ åsQ…è.-7É';A<æ…-å¥CÖ†D?o?A Cù Ŝ4ö(=$¥ Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù Ŝ4hP!Cù ŜAø ü N£i§gdžà¥ß£R? ‚ÆN0¿F

Dus niet echt dat je zegt 2 keer zo kort...
wat voor telefoon heb je?
want ik heb wel eens gehoort dat er 2 verschillende SMS standaarden zijn
mijn telefoon bijv kan ook niet alle SMSjes goed intrepeteren

10xAXItec AC-265P = 2,650kWp @ SolarEdge SE2200 - PVOutput


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Demo had ik gevraagd, maar daar konden ze niet aan beginnen zeiden ze. En het ligt niet aan de GSM, want ook op een andere GSM ontvang ik die rare zooi. Maar ik geef niet op...
Pagina: 1