PHP рдореЗрдВ UTF-8ред рднрд╛рдЧ 1

рдирдорд╕реНрдХрд╛рд░, рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореИрдВ рдПрдХ рдЙрдЬреНрдЬрд╡рд▓ рднрд╡рд┐рд╖реНрдп рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рд░ рдХреЛрдИ "рдХреЛрд╖реЗрд░" UTF-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдореЗрд░реЗ рдирд┐рдХрдЯрддрдо рд╡рд╛рддрд╛рд╡рд░рдг рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ - рд╡реЗрдм рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ - PHP, рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рдФрд░ рд╕рд╛рдЗрдХрд┐рд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред



1. рдкрд░рд┐рдЪрдп



рдЖрдЧреЗ рдХреЗ рдкрд╛рда рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкрд░ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдирдЬрд╛рди рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдореМрдЬреВрдж рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдФрд░ рдЗрд╕рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЛ рднреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдирдХреЛрдбрд┐рдВрдЧ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рдЯреЗрдмрд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, рдореБрдЦреНрдп ASCII рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдг рдХреЛрдб рдФрд░ рд▓реИрдЯрд┐рди рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ, рдХреБрд▓ 128 (127 рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ 7 рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред



рдЕрдиреНрдп ASCII рдЧреНрд░рдВрдереЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рдЕрдиреНрдп рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдмрдирд╛рдП рдЧрдП рдереЗ рдЬрд┐рд╕рдореЗрдВ 8 рд╡рд╛рдВ рдмрд┐рдЯ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 256 рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ 128 рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ ASCII рдХреЗ рдЕрдиреБрд░реВрдк рдереЗ, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рд▓реЛрдЧреЛрдВ рдореЗрдВ, рд╣рд░ рдХреЛрдИ рд╡рд╣ рд╕рдм рдХреБрдЫ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдФрд░ рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдкрд╛рд╕ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдкрдиреЗ рд╕реЗрдЯ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗрд╡рд▓ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рдВрдХреАрд░реНрдг рд╕рд░реНрдХрд▓ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдХреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдИ рдереА, рдЙрдиреНрд╣реЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдЕрдм рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдЬреИрд╕рд╛ рд╣реИ (рдирд┐рдореНрди рднрд╛рдЧреЛрдВ рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред



рдирддреАрдЬрддрди, рдЗрд╕реЗ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдПрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЬреЛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓реЗрдЦрди рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦрди рдХреА рджрд┐рд╢рд╛)ред рдпреВрдирд┐рдХреЛрдб рдмрдирд╛рдХрд░ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдПрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рд▓реЗрдЦрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рдПрдирдХреЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред



рд╡реЗрдм рдкрд░ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдПрдиреНрдХреЛрдбрд┐рдВрдЧ UTF-8 рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИрдВ:



рдореИрдВ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдкрд╣рд▓реЗ рдПрдХ рдореЗрдЬ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рдЕрдм рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдереЛрдбрд╝реА рдЧрд╣рд░рд╛рдИ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рднрдВрдбрд╛рд░рдг рд╕рд┐рджреНрдзрд╛рдВрдд (рдПрдХреНрд╕ - рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдмрд┐рдЯреНрд╕) рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдмрд┐рдЯ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп 1 рд╕рдкреНрддрдХ 2 рдЕрд╖реНрдЯрдХ 3 рдУрдХрдЯреЗрдЯ 4 рдУрдХрдЯреЗрдЯ
рдСрдХреНрдЯреЗрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ рд╕рддрдд рдЕрд╖реНрдЯрдХ
7 U + 007F 0xxxxxxx
11 U + 07FF 110xxxxx 10xxxxxx
16 U + FFFF 1110xxxx 10xxxxxx 10xxxxxx
21 U + 10FFFF (рдорд╛рдирдХ рд╕реЗ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ U + 1FFFFF) 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx




рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдСрдХреНрдЯреЗрдЯ рдХреЗ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЕрдЧреНрд░рдгреА рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╢реВрдиреНрдп рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдСрдХреНрдЯреЗрдЯ рд╣реИ, рддреЛ рдЕрдЧреНрд░рдгреА рдЗрдХрд╛рдИ рдХреЛ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рдСрдХреНрдЯреЗрдЯ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред



рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ "Hi Hi" UTF-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рджрд┐рдЦреЗрдЧрд╛ред



рдкрд╣рд▓рд╛ рдХрджрдоред рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЛ рдЙрд╕рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдмрджрд▓реЗрдВ (рдореИрдВ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛) рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред



рд╣рд╛рдп рд╣рд╛рдп = 0x041F 0x0440 0x0438 0x0432 0x044D 0x0442 0x0020 0x0048 0x0069

рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЕрдВрддрд░рд┐рдХреНрд╖ рднреА рдПрдХ рдкреНрд░рддреАрдХ рд╣реИред



рдЪрд░рдг рджреЛ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕реЗ рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред рд╣рдо рд╡рд┐рдВрдбреЛрдЬ 7 рдХреИрд▓рдХреБрд▓реЗрдЯрд░ (рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореЛрдб рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред



0x041F = 0000 0100 0001 1111

0x0440 = 0000 0100 0100 0000

0x0438 = 0000 0100 0011 1000

0x0432 = 0000 0100 0011 0010

0x0435 = 0000 0100 0011 0101

0x0442 = 0000 0100 0100 0010

0x0020 = 0010 0000

0x0048 = 0100 1000

0x0069 = 0110 1001

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╢реВрдиреНрдп рдХреЛ рдЙрдЪреНрдЪ рдЕрдВрдХреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рд╡рд░реНрдг рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЪрд░рдг рддреАрди рдпреВрдЯреАрдПрдл -8 рдСрдХреНрдЯреЗрдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЕрднреНрдпрд╛рд╡реЗрджрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВред



0x041F = 100 0001 1111 = 110 xxxxx 10xxxxxx = 110 10000 10 011111

0x0440 = 100 0100 0000 = 110 xxxxx 10xxxxxx = 110 10001 10 000 000

0x0438 = 100 0011 1000 = 110 xxxxx 10xxxxxx = 110 10000 10 111000

0x0432 = 100 0011 0010 = 110 xxxxx 10xxxxxx = 110 10000 10 110010

0x0435 = 100 0011 0101 = 110 xxxxx 10xxxxxx = 110 10000 10 110 101

0x0442 = 100 0100 0010 = 110 xxxxx 10xxxxxx = 110 10001 10 000010

0x0020 = 010 0000 = 0 xxxxxx = 0 0100000

0x0048 = 100 1000 = 0 xxxxxx = 0 1001000

0x0069 = 110 1001 = 0 xxxxxx = 0 1101001

рдХрд╛рдЙрдВрдЯрд░ рдмреЛрд▓реНрдб рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: 0x0080 рддрдХ рдХреЗ рдХреЛрдб рд╡рд╛рд▓реЗ рдЕрдХреНрд╖рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рд╣реЗрдЬреЗ рдЧрдП рд╣реИрдВ, рдпрд╣ ASCII рд╕рдВрдЧрддрддрд╛ рд╣реИред рдпрд╣ рднреА рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпреВрдЯреАрдПрдл -8 рд╡рд┐рдВрдбреЛрдЬрд╝ -1251 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд░реВрд╕реА-рднрд╛рд╖рд╛ рдХреЗ рдкрд╛рда рдХреЗ рд▓рд┐рдП 2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕реНрдерд╛рди (2 рдмрд╛рдЗрдЯреНрд╕) рд▓реЗрдЧрд╛, рдЬреЛ рдХреЗрд╡рд▓ 1 рдмрд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред



рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдкреВрд░реЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ): "11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 1010101 11010001 10000010010000 01001000 01101001"ред



рдЖрдк рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

$ tmp = '' ;

foreach ( рд╡рд┐рд╕реНрдлреЛрдЯ) ( '' , '11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 00100000 01001000 01101001 ) $ рдУрдХреНрдЯреЗрдЯ ) {

$ tmp = chr ( bindec ( $ octet ) ) ;

}

рдЧреВрдВрдЬ $ tmp ;




рдХреЛрдб рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╕рд░рд▓реАрдХреГрдд):
  1. 1 рд╡рд░реНрдг рдореЗрдВ рдЕрд╖реНрдЯрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдорд╛рди рдХреЛ рд╕рд╣реЗрдЬреЗрдВ;
  2. рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рд╕реЗ рдУрдХрдЯреЗрдЯ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рд╢реЗрд╖ рдХреЛ рдмрдЪрд╛рдПрдВ;
  3. рдпрджрд┐ 1 рд╕реЗ рдЕрдзрд┐рдХ рдСрдХреНрдЯреЗрдЯ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдСрдкрд░реЗрд╢рди 2 рдХреЗ рдмрд╛рдж рд╢реЗрд╖ рдХреЛ 6 рдмрд┐рдЯреНрд╕ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЙрдирдореЗрдВ рдмрд╛рдж рдХреЗ рдСрдХреНрдЯреЗрдЯ рдХреЗ рдирд┐рдЪрд▓реЗ 6 рдмрд┐рдЯреНрд╕ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦреЗрдВ;
  4. 1 рдмрд┐рдВрджреБ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдиреЗ рддрдХ рджреЛрд╣рд░рд╛рдПрдВ :)ред




рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреНрдб PHP рдХреЛрдб рдЬреЛ рдЖрдкрдХреЛ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдФрд░ рдЙрд▓рдЯрд╛ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдореИрдВ рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВрдВрдЧрд╛):

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 ; } } }



  1. 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 ; } } }



  2. 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 ; } } }



  3. 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 ; } } }



  4. 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 ; } } }



  5. 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 ; } } }



  6. 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 ; } } }



  7. 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 ; } } }



  8. 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 ; } } }



  9. 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 ; } } }



  10. 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 ; } } }



  11. 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 ; } } }



  12. 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 ; } } }



  13. 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 ; } } }



  14. 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 ; } } }



  15. 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 ; } } }



  16. 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 ; } } }



  17. 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 ; } } }



  18. 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 ; } } }



  19. 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 ; } } }



  20. 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 ; } } }



  21. 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 ; } } }



  22. 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 ; } } }



  23. 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 ; } } }



  24. 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 ; } } }



  25. 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 ; } } }



  26. 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 ; } } }



  27. 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 ; } } }



  28. 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 ; } } }



  29. 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 ; } } }



  30. 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 ; } } }



  31. 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 ; } } }



  32. 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 ; } } }



  33. 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 ; } } }



  34. 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 ; } } }



  35. 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 ; } } }



  36. 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 ; } } }



  37. 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 ; } } }



  38. 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 ; } } }



  39. 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 ; } } }



  40. 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 ; } } }



  41. 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 ; } } }



  42. 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 ; } } }



  43. 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 ; } } }



  44. 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 ; } } }



  45. 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 ; } } }



  46. 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 ; } } }



  47. 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 ; } } }



  48. 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 ; } } }



  49. 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 ; } } }



  50. 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 ; } } }



  51. 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 ; } } }



  52. 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 ; } } }



  53. 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 ; } } }



  54. 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 ; } } }



  55. 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 ; } } }



  56. 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 ; } } }



  57. 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 ; } } }



  58. 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 ; } } }



  59. 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 ; } } }



  60. 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 ; } } }



  61. 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 ; } } }



  62. 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 ; } } }



  63. 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 ; } } }



  64. 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 ; } } }



  65. 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 ; } } }



  66. 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 ; } } }



  67. 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 ; } } }



  68. 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 ; } } }



  69. 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 ; } } }



  70. 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 ; } } }



  71. 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 ; } } }



  72. 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 ; } } }



  73. 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 ; } } }



  74. 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 ; } } }



  75. 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 ; } } }



  76. 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 ; } } }



  77. 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 ; } } }



  78. 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 ; } } }



  79. 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 ; } } }



  80. 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 ; } } }



  81. 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 ; } } }



  82. 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 ; } } }



  83. 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 ; } } }



  84. 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 ; } } }



  85. 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 ; } } }



  86. 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 ; } } }



  87. 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 ; } } }



  88. 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 ; } } }



  89. 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 ; } } }





GetChar () рд╡рд┐рдзрд┐ Jevix рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓реА рдЧрдИ рдереА, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдХреЛрдб рдХреЛ рд╡реИрд╕реЗ рднреА рджреЗрдЦрд╛ рдерд╛, рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╕реНрдореГрддрд┐ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рд▓реЗрдЦрдХ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрдИрдорд╛рдиреА рд╣реЛрдЧреАред



рдЖрдк рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рдХрдХреНрд╖рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

Copy Source | Copy HTML



  1. // рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ
  2. $ obj = new String_Multibyte ();
  3. // рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЗрди рдмрдирд╛рддреЗ рд╣реИрдВ
  4. $ tmp = '' ;
  5. foreach (рд╡рд┐рд╕реНрдлреЛрдЯ) ( '' , '11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 00100000 01001000 01101001 ) $ рдУрдХреНрдЯреЗрдЯ ) {
  6. $ tmp = chr (bindec ( $ octet ));
  7. }
  8. // рдЪрд░рд┐рддреНрд░ рдХреЛрдб рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдПрдБ
  9. $ рдирдХреНрд╢рд╛ = рд╕рд░рдгреА ();
  10. $ рд▓реЗрди = рд╕реНрдЯреНрд░рд▓реЗрди ( $ tmp );
  11. рдХреЗ рд▓рд┐рдП ( $ i = 0 ; $ i < $ l ; $ i ++) {
  12. рдЕрдЧрд░ ( рд╕рд╣реА == ( $ рдкрд░рд┐рдгрд╛рдо = $ obj -> getCodePoint ( $ tmp , $ i ))) {
  13. $ рдирдХреНрд╢рд╛ [] = $ рдкрд░рд┐рдгрд╛рдо ;
  14. }
  15. }
  16. // рд▓рд╛рдЗрди рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдореИрдк рд╕реЗ рд░рд┐рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ
  17. $ tmp = '' ;
  18. $ рдЧрд┐рдирддреА = рдЧрд┐рдирддреА ( $ рдирдХреНрд╢рд╛ );
  19. рдХреЗ рд▓рд┐рдП ( $ i = 0 ; $ i < $ count ; $ i ++) {
  20. $ tmp ред = $ obj -> getChar ( $ рдирдХреНрд╢рд╛ [ $ i ]);
  21. }
  22. // рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореБрджреНрд░рд┐рдд рдХрд░реЗрдВ
  23. рдЗрдХреЛ $ tmp , '<br />' .EOL;
  24. // рдЗрд╕реЗ рд╡реИрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ (рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ)
  25. рдЧреВрдВрдЬ preg_match ( '#ред {1} #u' , $ tmp )? 'рдорд╛рдиреНрдп рдпреВрдирд┐рдХреЛрдб' : 'рдЕрдЬреНрдЮрд╛рдд' , '<br />' .EOL;
рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рдпрд╛ рд╕рд╣реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╢рд╛рдВрдд рд░реВрдк рд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рдЕрдорд╛рдиреНрдп рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рдорд╛рдиреНрдп рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред



рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд╛рда рдореЗрдВ рдХреБрдЫ рднреА рдЕрддрд┐рд╢реНрдпреЛрдХреНрддрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ (рдЕрдкреНрд░рд╛рдкреНрдп, рдЧреИрд░-рдЕрдВрдХрди, рдЕрдирд┐рд╢реНрдЪрд┐рдд, рд╕рд░реЛрдЧреЗрдЯ рдЖрджрд┐) рд╡рд░реНрдгреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХред



рдкреБрдирд╢реНрдЪ:
рдЖрдЧреЗ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг, рд╕реБрд░рдХреНрд╖рд╛, рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдг рдФрд░ PHP рдореЗрдВ UTF-8 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред



рд╕рдВрджрд░реНрдн:



All Articles