UTF-8 is a variant of unicode. It uses a variable bit length to represent characters beyond the ascii character sets. I think it goes up to. . . 32 bits max, and as few as 7. Unicode character sets are required to display the Asian characters.
PHP itself will pass through UTF8 though, since it is just bits when it comes down to it. The DBMS is encoded with the charsets as well so it knows how to represent them, and PHP is capable of accepting the "text" from the DB, and pushing a UTF-8 header to the browser so it also interprets it correctly. The problem is the middle man, if you try to manipulate it in PHP, you have to describe to it how many bits it needs in order to consider a character. When I ask for $str, by default it will take the first char off of the string, which is 8 bits. If it's a 16bit character, than I only end up with "half" of the character I need, which when presented as text will likely appear as nothing but rubbish.