Christian Kruse: Stringlänge und utf-8-Zeichen

Beitrag lesen

你好 Elya,

irgendwie habe ich geahnt, daß es nicht ganz trivial ist ;-) Ich probiere
das heute abend mal aus, mal sehen, wie ich die octets aus dem String
gefummelt bekomme.

Ein Octet ist bei PHP in jedem Fall ein Byte und damit ein “Buchstabe”. Es
ist also trivial, einzelne Octets zu betrachten, substr($str,$pos,1) reicht
da aus, bzw. bei PHP geht ja auch $str{$pos}. Ueberpruefen, um welche
Art Zeichen es sich handelt, kannst du dann recht einfach mit
Bit-Operationen:

  
if(ord($str{$pos}) < 0x80) {  
  # ein Zeichen lang  
}  
else if(ord($str{$pos}) < 0x2c) {  
  # illegale UTF-8-Sequenz, dieser Werte-Bereich kann nicht  
  # auftreten als Start-Sequenz  
}  
else if(ord($str{$pos}) < 0xe0) {  
  # zwei Byte lang  
}  
else if(ord($str{$pos}) < 0xf0) {  
  # drei Byte lang  
}  
else if(ord($str{$pos}) < 0xf8) {  
  # vier Byte lang  
}  
# Support fuer 6-Byte-UTF8, wie es im ISO/IEC beschrieben ist  
else if(ord($str{$pos}) < 0xfc) {  
  # fuenf Byte lang  
}  
else if(ord($str{$pos}) < 0xfe) {  
  # 6 Byte lang  
}  
else {  
  # illegale UTF-8-Sequenz, dieser Werte-Bereich kann nicht  
  # auftreten als Start-Sequenz  
}  

Ist allerdings nicht getestet, sollte aber funktionieren.

再见,
克里斯蒂安

--
Coincidence?! I THINK NOT!!