It is because different code is used for Cerr output. Cout performs character set conversion (UTF8->console OEM charset), Cerr does not.
The reason is that conversion has some bad properties and it was deemed unlikely that somebody outputs unicode to error output. We might have been wrong...