How can I make sure that simulated cloth doesn't go through other objects?
In order to keep the cloth from going through other objects you need to enable Cloth Collision.  Cloth collision allows other objects to influence the calculation of the cloth simulation.  (Adding the Collision physics type only allows other objects and particles to collide with the cloth, it does not influence the cloth simulation of the object on which it is enabled.)

When Cloth Collision is enabled, the cloth simulation will collide with all objects which have the Collision physics type enabled.  So in your case, you should enable Cloth Collision in the cloth sim settings and enable Collision physics on the character.



To get a decent looking simulation you will have to play around with the collision settings.  Here are a few key things to adjust:


Quality is basically the number of steps blender takes to simulate the cloth, higher quality = more steps = longer baking time = better looking simulation.  I rarely find the default quality of 2 to be decent, I often use between 3 and 5.
Distance is essentially the "thickness" of the cloth, the threshold of how far away from the cloth mesh a collision is registered.  This is important because, due to the geometric nature of a mesh, there will always be intersections between two colliding objects.  By increasing this you can move the collisions away from the actual geometry slightly, minimizing actual geometric intersections.
Friction is how "sticky" the cloth is, how much it resists being dragged against another surface.  If your cloth has too much friction it will stick to the character unnaturally as it deforms, too little friction and it will appear unrealistically silky.
Self Collision allows the cloth to collide with itself.  Enable this if the cloth mesh is intersecting and going through itself too much.  Self Collision has its own Quality and Distance values for better control.  This will drastically increase baking times too, so beware!