Why, in standard OFS\ObjectManager.py do you reject Object Id's with % character ?
I've modified the 45th line of Python script
from : bad_id=re.compile(r'[^a-zA-Z0-9-_~,.$\(\)# ]').search #TS
to bad_id=re.compile(r'[^a-zA-Z0-9-_~,.$\(\)# ]%').search #TS
and every thing seems all-right ;-)
The advantage is that you can directly manage special character within the Id of object with url_quote and url_unquote. By example in your File Library Example, Zope will accept every file name with a little modification of CookId in OFS\Image.py
Thank you for telling me if is is unsure to keep % character into Ids.