Is there a way to keep certain edges unaffected during subsurf?
Unfortunately the subsurf can not be masked by vertex groups.

But there are several solutions:

A)


Select your hard edges
Invert selection
Subdivide
Hit 'Smooth Vertex' in the Tools panel
Move the edges (that now a are a little out-set) to the right places


Lots of manual work but you have all the control. Should be feasable on a low poly character.

Results depend on you artistic skills.

B) Using EdgeSplit

on the hard edges and applying subsurf to the rest. Then rejoin the Edges after you applied subsurf.

Did not test with a character (especially if its already weight painted)

C) What I usually do is the following:


If you character turns into a blob on subsurf-lvl-2 already it is to low poly.
You need to subdivide the whole mesh.
(That preserves your low-poly shape but adds more faces for the subsurf to not make a blob)
After it looks good with the subsurf modifier you can apply it.
Select your hard edges and parts of hi detail (like the face)
Invert selection and create a "LoPoly" vertex group.
Use the Decimate modifier with lvl X to reduce the polycount while masking it to the LoPoly vertex group.
Apply the decimate.


Your edges stay hi poly and sharp.
The rest is lowpoly but smoothed by the subsurf you applied before.