@@ -245,8 +245,23 @@ def _read(self, fp, fpname):
245
245
if pos != - 1 and optval [pos - 1 ].isspace ():
246
246
optval = optval [:pos ]
247
247
optval = optval .strip ()
248
- if optval == '""' :
249
- optval = ''
248
+
249
+ # Remove paired unescaped-quotes
250
+ unquoted_optval = ''
251
+ escaped = False
252
+ in_quote = False
253
+ for c in optval :
254
+ if not escaped and c == '"' :
255
+ in_quote = not in_quote
256
+ else :
257
+ escaped = (c == '\\ ' )
258
+ unquoted_optval += c
259
+
260
+ optval = unquoted_optval
261
+
262
+ optval = optval .replace ('\\ \\ ' ,'\\ ' )# Unescape backslashes
263
+ optval = optval .replace (r'\"' ,'"' )# Unescape quotes
264
+
250
265
optname = self .optionxform (optname .rstrip ())
251
266
cursect [optname ]= optval
252
267
else :
@@ -303,7 +318,11 @@ def write_section(name, section_dict):
303
318
fp .write ("[%s]\n " % name )
304
319
for (key ,value )in section_dict .items ():
305
320
if key != "__name__" :
306
- fp .write ("\t %s = %s\n " % (key ,str (value ).replace ('\n ' ,'\n \t ' )))
321
+ value = str (value )
322
+ value = value .replace ('\\ ' ,'\\ \\ ' )# Escape backslashes
323
+ value = value .replace ('"' ,r'\"' )# Escape quotes
324
+ value = value .replace ('\n ' ,'\n \t ' )
325
+ fp .write ("\t %s = %s\n " % (key ,value ))
307
326
# END if key is not __name__
308
327
# END section writing
309
328