strlen() verzaehlt sich

strlen() verzaehlt sich

am 11.04.2008 10:55:51 von Klaus Herzberg

Hallo,

strlen("dies ist ein ä-string"): 19

Korrekt waere 21. Auf 2 Server laeuft es korrekt. Aber auf dem einem
eben nicht. PHP Version 5.2.5. Aber daran allein kann es nicht liegen,
weil bspw. lokal mit der selben PHP-Version tritt der Fehler nicht auf.

Ich habe schon gelesen, dass strlen Probleme macht und
mb_string-Funktionen verwendet werden sollten, allerding
"--enable-mbstring" zeigt phpinfo an.

Einen Tipp?

Vielen Dank.
mfg. klaus.

Re: strlen() verzaehlt sich

am 11.04.2008 11:03:09 von Christian Mayer

Klaus Herzberg schrieb:
> Hallo,
>
> strlen("dies ist ein ä-string"): 19
>
> Korrekt waere 21. Auf 2 Server laeuft es korrekt. Aber auf dem einem
> eben nicht. PHP Version 5.2.5. Aber daran allein kann es nicht liegen,
> weil bspw. lokal mit der selben PHP-Version tritt der Fehler nicht auf.
>
> Ich habe schon gelesen, dass strlen Probleme macht und
> mb_string-Funktionen verwendet werden sollten, allerding
> "--enable-mbstring" zeigt phpinfo an.
>
> Einen Tipp?
>
> Vielen Dank.
> mfg. klaus.

Hi Klaus,

Mein Tipp: Selber eine Funktion schreiben, die den String zaehlt. ;)
"substr" waere da ein Ansatz.

--
Greetz,
Christian Mayer aka TheFox
http://fox21.at

Re: strlen() verzaehlt sich

am 11.04.2008 11:38:54 von steffen bruentjen

Klaus Herzberg wrote:

>strlen("dies ist ein ä-string"): 19
>
>Korrekt waere 21. Auf 2 Server laeuft es korrekt. Aber auf dem einem
>eben nicht. PHP Version 5.2.5. Aber daran allein kann es nicht liegen,
>weil bspw. lokal mit der selben PHP-Version tritt der Fehler nicht auf.
>
>Ich habe schon gelesen, dass strlen Probleme macht und
>mb_string-Funktionen verwendet werden sollten, allerding
>"--enable-mbstring" zeigt phpinfo an.

Das ist doch schonmal ganz gut.. Jetzt lies auch noch den
entsprechenden Abschnitt im Handbuch, und Du findest raus, dass Du
entweder

1. mb_strlen('ä', 'UTF-8');

oder

2. mb_internal_encoding('UTF-8');
mb_strlen('ä');

benutzen musst, oder, falls sich Deine Zeichen auf iso-8859-1 abbilden
lassen, Du auch alternativ

3. strlen(utf8_decode('ä'));

benutzen kannst oder Dir alternativ auch noch eine Änderung der
php.ini (mbstring.func_overload mind. auf 2) die Möglichkeit gibt,
weiterhin

4. strlen('ä')

zu verwenden. Oder aber du wartest auf

5. PHP 6.


Schöne Grüße, Steffen

--
Das Tastaturlayout für Programmierer:
http://eurkey.steffen.bruentjen.eu

Re: strlen() verzaehlt sich

am 11.04.2008 11:39:30 von Ralph Stahl

Klaus Herzberg schrieb:
> Hallo,
>
> strlen("dies ist ein ä-string"): 19
>
> Korrekt waere 21. Auf 2 Server laeuft es korrekt. Aber auf dem einem
> eben nicht. PHP Version 5.2.5. Aber daran allein kann es nicht liegen,
> weil bspw. lokal mit der selben PHP-Version tritt der Fehler nicht auf.
>
> Ich habe schon gelesen, dass strlen Probleme macht und
> mb_string-Funktionen verwendet werden sollten, allerding
> "--enable-mbstring" zeigt phpinfo an.
>
> Einen Tipp?

mb_strlen() könnte Dein Freund sein:
http://php.net/mb_strlen

Umlaute und sonstiges bestehen eben nicht nur aus 1 Byte, daher die
Verzählung. Gleiches gilt für alle anderem String-Funktionen wie zum
Bleistift mb_substr().

Ralph

mb_strlen verzaehlt sich, was: Re: strlen() verzaehlt sich

am 11.04.2008 12:07:41 von Klaus Herzberg

Hallo,
erstmal vielen Danke fuer die Hinweise.

Ich haette natuerlich noch schreiben koennen, dass ich die Funktion
strlen() unveraendert weiter benutzen muss, weil es eine Typo3-Seite ist
und ich den Quelltext nicht anpassen werden:)

Aber: Habe mbstring.func_overload auf 0 gesetzt. Jetzt zaehlt strlen
richtig. Daher getestet:

mb_strlen("dies ist ein ä-string"): 19

D.h. mb_strlen verzaehlt sich. Woran koennte das liegen?

Danke.
mfg. klaus.

Re: mb_strlen verzaehlt sich, was: Re: strlen() verzaehlt sich

am 11.04.2008 12:33:23 von Stefan+Usenet

On Fri, 11 Apr 2008 12:07:41 +0200 Klaus Herzberg wrote:
> mb_strlen("dies ist ein ä-string"): 19
> D.h. mb_strlen verzaehlt sich. Woran koennte das liegen?

Ad hoc haette ich gesagt: an der Einstellung fuer den von mb_*
verwendeten Zeichensatz. Aber 19 ist fuer diesen String schon
ein _sehr_ interessantes Ergebnis.

Hmpf. Leider ist das PHP-Manual gerade, aeh, irgendwie offline...

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

2008! Das Jahr von Stefan. Unerhörter geht's kaum.
(Sloganizer)

Re: mb_strlen verzaehlt sich, was: Re: strlen() verzaehlt sich

am 11.04.2008 13:30:08 von Ralph Stahl

Klaus Herzberg schrieb:
> Hallo,
> erstmal vielen Danke fuer die Hinweise.
>
> Ich haette natuerlich noch schreiben koennen, dass ich die Funktion
> strlen() unveraendert weiter benutzen muss, weil es eine Typo3-Seite ist
> und ich den Quelltext nicht anpassen werden:)
>
> Aber: Habe mbstring.func_overload auf 0 gesetzt. Jetzt zaehlt strlen
> richtig. Daher getestet:

Wenn das "richtige" strlen() richtig zählt, ist es doch kein
utf-8-String, oder verstehe ich jetzt was falsch?

> mb_strlen("dies ist ein ä-string"): 19

19? Supi!

> D.h. mb_strlen verzaehlt sich. Woran koennte das liegen?

Vielleicht hilft Dir http://de3.php.net/manual/de/mbstring.overload.php
noch ein Stück weiter - vor allem die Info darin "may lead to undefined
behaviour" :-).

Ralph

Re: mb_strlen verzaehlt sich, was: Re: strlen() verzaehlt sich

am 11.04.2008 13:50:47 von Klaus Herzberg

Ralph Stahl wrote:
> Klaus Herzberg schrieb:
>> Hallo,
>> erstmal vielen Danke fuer die Hinweise.
>>
>> Ich haette natuerlich noch schreiben koennen, dass ich die Funktion
>> strlen() unveraendert weiter benutzen muss, weil es eine Typo3-Seite ist
>> und ich den Quelltext nicht anpassen werden:)
>>
>> Aber: Habe mbstring.func_overload auf 0 gesetzt. Jetzt zaehlt strlen
>> richtig. Daher getestet:
>
> Wenn das "richtige" strlen() richtig zählt, ist es doch kein
> utf-8-String, oder verstehe ich jetzt was falsch?
nein, das hast Du richtig erkannt. In dem Beispiel ist kein utf-8. Als
utf-8 sagt strlen "richtigerweise" 22.

Also:
utf-8:
mb_strlen("dies ist ein ä-string") = 21 (fein)
ansi/latin...
mb_strlen("dies ist ein ä-string") = 19 (schlecht)

>> mb_strlen("dies ist ein ä-string"): 19
>
> 19? Supi!
wieso?

>> D.h. mb_strlen verzaehlt sich. Woran koennte das liegen?
>
> Vielleicht hilft Dir http://de3.php.net/manual/de/mbstring.overload.php
> noch ein Stück weiter - vor allem die Info darin "may lead to undefined
> behaviour" :-).
Danke, schaue ich mir an.

mfg. klaus

Re: mb_strlen verzaehlt sich, was: Re: strlen() verzaehlt sich

am 11.04.2008 13:57:47 von Wolfgang Fellger

Klaus Herzberg schrieb:

>mb_strlen("dies ist ein ä-string"): 19
>
>D.h. mb_strlen verzaehlt sich. Woran koennte das liegen?

Der String ist in ISO-8859-1, wird aber fälschlich als UTF-8 interpretiert.
Das Ergebnis ist "dies ist ein ?tring" - Länge 19.

--
Wolfgang Fellger

Re: mb_strlen verzaehlt sich, was: Re: strlen() verzaehlt sich

am 11.04.2008 16:19:46 von Niels Braczek

Klaus Herzberg schrieb:

> mb_strlen("dies ist ein ä-string"): 19
>=20
> D.h. mb_strlen verzaehlt sich. Woran koennte das liegen?

Offensichtlich ist "ä-s" ein Sonderzeichen.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: mb_strlen verzaehlt sich, was: Re: strlen() verzaehlt sich

am 11.04.2008 19:07:39 von Claus Reibenstein

Niels Braczek schrieb:

> Klaus Herzberg schrieb:
>
>> mb_strlen("dies ist ein ä-string"): 19
>>
>> D.h. mb_strlen verzaehlt sich. Woran koennte das liegen?
>
> Offensichtlich ist "ä-s" ein Sonderzeichen.

Zumindest wird es offenbar so interpretiert.

Bei UTF-8 bestimmt das erste Byte, wie viele Bytes das Zeichen
definieren. Beginnt dieses Byte beispielsweise mit der Bitfolge 1110,
besteht das Zeichen aus 3 Bytes.

Gruß. Claus