PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   Sonderzeichen über String Index einfügen geht nich (http://www.selfphp.de/forum/showthread.php?t=25643)

Helmut 24.10.2015 12:04:57

Sonderzeichen über String Index einfügen geht nich
 
Hallo zusammen,

ich hab folgendes Problem:

$strTest = 'á'; // Sonderzeichen a mit Akzent
echo $strTest;

funktioniert einwandfrei, das Sonderzeichen 'á' wird korrekt dargestellt (mit charset="utf-8")

Aber, folgendes funktioniert nicht:

$strTest = 'hallo';
$strTest[1] = 'á'; // Sonderzeichen über String Index ersetzen
echo $strTest;

Jetzt wird das Sonderzeichen 'á' nicht mehr korrekt dargestellt, es erscheint 'h�llo'

Weiß jemand, woran das liegt, bzw. wie man es korrigiert?
Wenn ich es mit String-Operatoren mache, also "substr" etc, geht es auch.
Ich würde aber eigentlich gerne den direkten Zugriff über den Index [] verwenden

vielen Dank
Helmut

Helmut 24.10.2015 16:35:54

AW: Sonderzeichen über String Index einfügen geht nich
 
Also, ich glaub, ich hab es selbst gefunden.
Es geht nicht, da die Array-Notation für Strings nicht Multibyte-Aware ist.

PHP unterscheidet zwischen normalen ASCII Zeichen (0..127) und Extended ASCII Zeichen (128..255). Für die Extended ASCIIs (und darüber hinausgehende Kodierungen (etwa utf-8) gibt es die Multibyte Funktionen.


// So liefern die PHP Funktionen strLen und mb_strlen für nicht-extended ASCII Zeichen (0..127) den selben Wert:

$strTest = 'abc';
echo 'out1 = ' .strlen($strTest) .'<br>'; // result = 3
echo 'out2 = ' .mb_strlen($strTest) .'<br>'; // result = 3

// Für extended ASCII Zeichen (128..255), liefern strLen und mb_strlen aber unterschiedliche Werte:

$strTest = 'äöü';
echo 'out1 = ' .strlen($strTest) .'<br>'; // result = 6 (strlen zählt jetzt 2 Byte je Zeichen)
echo 'out2 = ' .mb_strlen($strTest) .'<br>'; // result = 3 (Multibyte-Length bleibt bei drei Byte)


Für Multibyte-Strings, kann man jetzt noch versuchen über die Array Notation 2 Bytes zu schreiben; für die normalen ASCIIs bekommt das hin (also z.B. $strTest[2] = ''; $strTest[3] = 'x'), aber für Sonderzeichen geht das schief.
Also werde ich wohl alle meine strlen, strpos und substr etc. durch die entsprechenden mb-Varianten ersetzen.

Wer das noch genauer wissen möchte, hier gibt es ein paar Links:
http://www.sitepoint.com/working-wit...ibyte-strings/

http://stackoverflow.com/questions/9...-string-in-php

http://iconoun.com/articles/collisions/


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:31:53 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.