note 29662 added to function.utf8-decode

From: Date: Thu, 20 Feb 2003 19:08:54 +0000
Subject: note 29662 added to function.utf8-decode
Groups: php.notes 
Request: Send a blank email to php-notes+get-44268@lists.php.net to get a copy of this message
Well sometimes you need to store a utf-8 string in a database table column with a fixed size. Here is a function that fix a string which has been broken (by a substr for example) in a middle of a utf-8 char sequence. function FixUtf8BrokenString($Desc) { // UTF-8 encoding // bytes : representation // 1 : 0bbbbbbb // 2 : 110bbbbb 10bbbbbb // 3 : 1110bbbb 10bbbbbb 10bbbbbb // 4 : 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb // to see if a string is broken in middle of a utf8 char // we search for last byte encoding size of utf-8 char // if number of last bytes in string is lower than encoding size // we remove those last bytes // if last byte is ord < 128, ok. we return ! if (ord($Desc[strlen($Desc) - 1]) < (0x80)) return $Desc // loop for finding byte encoding size $nbbytes = 1; while (ord($Desc[strlen($Desc) - $nbbytes]) > 0x7F) { if (ord($Desc[strlen($Desc) - $nbbytes]) > 0xBF) break; $nbbytes++; } // check if byte encoding size is encoding a size of 4 bytes if (($Desc[strlen($Desc) - $nbbytes] & 0xF8 == 0xF0) && ($nbbytes == 4) return $Desc; // check if byte encoding size is encoding a size of 3 bytes if (($Desc[strlen($Desc) - $nbbytes] & 0xF0 == 0xE0) && ($nbbytes == 3) return $Desc; // check if byte encoding size is encoding a size of 2 bytes if (($Desc[strlen($Desc) - $nbbytes] & 0xE0 == 0xC0) && ($nbbytes == 2) return $Desc; // then this is the case where string is badly broken, we remove last bytes return substr($Desc, 0, -$nbbytes); } $str = "Ekonomi_ve_\xc4\xb0\xc5\x9f_D\xc3\xbcnyas\xc4\xb1"; $broken = substr($str, 0, 12); $fixed = FixUtf8BrokenString($broken); echo "$str<hr>$fixed<hr>$broken<hr>"; Sebastien Meudec. -- http://www.php.net/manual/en/function.utf8-decode.php http://master.php.net/manage/user-notes.php?action=edit+29662 http://master.php.net/manage/user-notes.php?action=delete+29662 http://master.php.net/manage/user-notes.php?action=reject+29662

« previous php.notes (#44268) next »