Necessity of escape / unescape
the longer I think about it the more I get the feeling I would like to have polib leave the entry strings unchanged, i.e. not apply unescape (on reads) and escape (on writes) to them. The main use case for gettext (and polib, for that matter) is handling strings that come from files - either source files or .po files. In those cases it would be easiest if the strings were left untouched, as they are. You read strings in and write them out, but you usually never need them in a "parsed" representation; they are just raw data, and that's fine. For example, the current implementation forces me to apply a polib.unescape() to a string collected from a source file, in order to use it properly as a POEntry.msgid.
The only exception from the general use case I can think of is when you want to bring Python string listerals into the game (ie. strings not read from files); and as polib is a Python module there might be occasions where you want to use it in this way. But then all you have to do is to use Python raw strings r'...' to populate POEntries. That would be the only concession for this use case, and an easy one at this, as it matches the po file format description (s. gettext) which mandates C-style escapes.
What do you think?