Bit | Maximum Stored Value | 1 octet | 2 octets | 3 octets | 4 octets |
---|---|---|---|---|---|
Initial octet | Continuing octets | ||||
7 | U + 007F | 0xxxxxxx | |||
eleven | U + 07FF | 110xxxxx | 10xxxxxx | ||
sixteen | U + FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
21 | U + 10FFFF (according to the standard, but really U + 1FFFFF) | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
$ tmp = " ;
foreach ( explode ( '' , '11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 00100000 01001000 01101001' ) as $ octet ) {
$ tmp . = chr ( bindec ( $ octet ) ) ;
}
echo $ tmp ;
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
Copy Source | Copy HTML class String_Multibyte { /** <br/> * UTF-8 , $index $char. <br/> * , , BOM 0x10FFFE-0x10FFFF FALSE. <br/> * <br/> * [...] , . <br/> * <br/> * @author Andrew Dryga <anddriga at gmail>, {@link http://andryx.habrahabr.ru}. <br/> * @param string $char (). <br/> * @param int &$index , . , . <br/> * @return int|false FALSE , . <br/> */ public function getCodePoint( $char , & $index = 0 ) { // $octet1 = ord( $char [ $index ]); // ASCII ( 0bbb bbbb), . if ( $octet1 >> 7 == 0x00 ) { return $octet1 ; } elseif ( $octet1 >> 6 != 0x02 ) { // if (! isset ( $char [++ $index ])) { return false ; } // $octet2 = ord( $char [ $index ]); // ( 10bb bbbb) if ( $octet2 >> 6 != 0x02 ) { -- $index ; return false ; } // 6 $octet2 &= 0x3F ; // , if ( $octet1 >> 5 == 0x06 ) { $result = ( $octet1 & 0x1F ) << 6 | $octet2 ; // if ( 0x80 < $result ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet3 = ord( $char [ $index ]); if ( $octet3 >> 6 != 0x02 ) { -- $index ; return false ; } $octet3 &= 0x3F ; if ( $octet1 >> 4 == 0x0E ) { $result = ( $octet1 & 0x0F ) << 12 | $octet2 << 6 | $octet3 ; // ; , BOM if ( 0x800 < $result && !( 0xD7FF < $result && $result < 0xF900 ) && $result != 0xFEFF ) { return $result ; } } else { if (! isset ( $char [++ $index ])) { return false ; } $octet4 = ord( $char [ $index ]); if ( $octet4 >> 6 != 0x02 ) { -- $index ; return false ; } $octet4 &= 0x3F ; if ( $octet1 >> 3 == 0x1E ) { $result = ( $octet1 & 0x07 ) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4 ; // ; ; // , Unicode 10FFFF if ( 0x10000 < $result && $result < 0xF0000 ) { return $result ; } } } } return false ; } } /** <br/> * UTF-8 . <br/> * [...] <br/> * @author ur001 <ur001ur001@gmail.com>, {@link http://ur001.habrahabr.ru}. <br/> * @param string $codePoint Unicode character ordinal. <br/> * @return string|FALSE UTF-8 FALSE . <br/> */ public function getChar( $codePoint ) { if ( $codePoint < 0x80 ) { return chr( $codePoint ); } elseif ( $codePoint < 0x800 ) { return chr( 0xC0 | $codePoint >> 6 ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x10000 ) { return chr( 0xE0 | $codePoint >> 12 ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } elseif ( $codePoint < 0x110000 ) { return chr( 0xF0 | $codePoint >> 18 ) . chr( 0x80 | $codePoint >> 12 & 0x3F ) . chr( 0x80 | $codePoint >> 6 & 0x3F ) . chr( 0x80 | $codePoint & 0x3F ); } else { return false ; } } }
I did not try to write the most beautiful or correct code for the tests, but with the help of it you can easily change the values of characters and immediately see the result. All invalid sequences will be ignored, the output string is always valid, but that’s not all.Copy Source | Copy HTML
- // Create an instance of the object
- $ obj = new String_Multibyte ();
- // Create a string in the most convenient way to test
- $ tmp = " ;
- foreach (explode ( " , " 11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 00100000 01001000 01101001 " ) as $ octet ) {
- $ tmp . = chr (bindec ( $ octet ));
- }
- // Build the character code map
- $ map = array ();
- $ len = strlen ( $ tmp );
- for ( $ i = 0 ; $ i < $ len ; $ i ++) {
- if ( true == ( $ result = $ obj -> getCodePoint ( $ tmp , $ i ))) {
- $ map [] = $ result ;
- }
- }
- // Clear the string and restore it from the map
- $ tmp = " ;
- $ count = count ( $ map );
- for ( $ i = 0 ; $ i < $ count ; $ i ++) {
- $ tmp . = $ obj -> getChar ( $ map [ $ i ]);
- }
- // Display the restored string
- echo $ tmp , '<br />' .EOL;
- // Check it for validity (this is the easiest way)
- echo preg_match ( '#. {1} #u' , $ tmp )? 'Valid Unicode' : 'Unknown' , '<br />' .EOL;
Source: https://habr.com/ru/post/113715/
All Articles