All this methods shoud work, except in some special circumstances. For example, if you are running a web server locally on a windows machine with php < 5.3.1, only a 'manual'     $db->query("SET NAMES 'utf8'"); before your actual query will work. 
Any other method trying to use MYSQL_ATTR_INIT_COMMAND will fail. 
Here's what I learnt today, struggling with this very problem :
- You can't refer to PDO::MYSQL_ATTR_INIT_COMMAND in some environments (i.e. mine, specifically I don't know). You have to explicitely use 1002 instead 
- With Zend Framework 1.11 ( perhaps since 1.8, to be confirmed ), you don't need to set database.params.driver_options.1002 = "SET NAMES utf8" in your config.ini : resources.db.params.charset = "utf8" will be enough for Zend_Db_Adapter_Pdo_Mysql to do it for you. 
- On windows, you need php >= 5.3.1 for MYSQL_ATTR_INIT_COMMAND to work.  
- If you replace your php version with 5.3.1 or higher (I also tested 5.3.3), you need to make sure you set a value to pdo_mysql.default_socket in your php.ini. The default empty value won't work (to be confirmed : I read something about this but didn't bother to try without it after finding out about point 5) 
- You also need to make sure you have '127.0.0.1 localhost' in your windows\system32\drivers\etc\hosts hidden system file (that wasn't a problem for php 5.3.0) 
With all this in mind, you should be able to save from yourself a day of googling and keep some of your hairs! ;)