From fa004ad36c86f4af406cfa3a84ec8b6cb391e6dd Mon Sep 17 00:00:00 2001
From: Ka-Ping Yee <ping@zesty.ca>
Date: Wed, 24 Jan 2001 17:19:08 +0000
Subject: Show '\011', '\012', and '\015' as '\t', '\n', '\r' in strings.
 Switch from octal escapes to hex escapes for other nonprintable characters.

---
 Doc/lib/liblinecache.tex       |   2 +-
 Doc/lib/liblocale.tex          |   2 +-
 Doc/lib/libmd5.tex             |   4 +-
 Doc/lib/libparser.tex          |   4 +-
 Doc/lib/libpyexpat.tex         |   4 +-
 Doc/lib/librotor.tex           |  14 +-
 Doc/lib/libstruct.tex          |   4 +-
 Doc/tut/tut.tex                |  20 +--
 Lib/test/output/test_cfgparser |  12 +-
 Lib/test/output/test_cookie    |   4 +-
 Lib/test/output/test_tokenize  | 308 ++++++++++++++++++++---------------------
 Objects/stringobject.c         |  23 ++-
 Objects/unicodeobject.c        |  25 +++-
 13 files changed, 221 insertions(+), 205 deletions(-)

diff --git a/Doc/lib/liblinecache.tex b/Doc/lib/liblinecache.tex
index f491d4c..8a9b914 100644
--- a/Doc/lib/liblinecache.tex
+++ b/Doc/lib/liblinecache.tex
@@ -41,5 +41,5 @@ Example:
 \begin{verbatim}
 >>> import linecache
 >>> linecache.getline('/etc/passwd', 4)
-'sys:x:3:3:sys:/dev:/bin/sh\012'
+'sys:x:3:3:sys:/dev:/bin/sh\n'
 \end{verbatim}
diff --git a/Doc/lib/liblocale.tex b/Doc/lib/liblocale.tex
index 974d696..107c21d 100644
--- a/Doc/lib/liblocale.tex
+++ b/Doc/lib/liblocale.tex
@@ -265,7 +265,7 @@ Example:
 >>> import locale
 >>> loc = locale.setlocale(locale.LC_ALL) # get current locale
 >>> locale.setlocale(locale.LC_ALL, 'de') # use German locale
->>> locale.strcoll('f\344n', 'foo') # compare a string containing an umlaut 
+>>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut 
 >>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale
 >>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale
 >>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale
diff --git a/Doc/lib/libmd5.tex b/Doc/lib/libmd5.tex
index bec1132..f471bae 100644
--- a/Doc/lib/libmd5.tex
+++ b/Doc/lib/libmd5.tex
@@ -25,14 +25,14 @@ the spammish repetition'}:
 >>> m.update("Nobody inspects")
 >>> m.update(" the spammish repetition")
 >>> m.digest()
-'\273d\234\203\335\036\245\311\331\336\311\241\215\360\377\351'
+'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
 \end{verbatim}
 
 More condensed:
 
 \begin{verbatim}
 >>> md5.new("Nobody inspects the spammish repetition").digest()
-'\273d\234\203\335\036\245\311\331\336\311\241\215\360\377\351'
+'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
 \end{verbatim}
 
 \begin{funcdesc}{new}{\optional{arg}}
diff --git a/Doc/lib/libparser.tex b/Doc/lib/libparser.tex
index 96256ad..9ff3f42 100644
--- a/Doc/lib/libparser.tex
+++ b/Doc/lib/libparser.tex
@@ -432,7 +432,7 @@ buried deep in nested tuples.
                (297,
                 (298,
                  (299,
-                  (300, (3, '"""Some documentation.\012"""'))))))))))))))))),
+                  (300, (3, '"""Some documentation.\n"""'))))))))))))))))),
    (4, ''))),
  (4, ''),
  (0, ''))
@@ -537,7 +537,7 @@ module docstring from the parse tree created previously is easy:
 >>> found
 1
 >>> vars
-{'docstring': '"""Some documentation.\012"""'}
+{'docstring': '"""Some documentation.\n"""'}
 \end{verbatim}
 
 Once specific data can be extracted from a location where it is
diff --git a/Doc/lib/libpyexpat.tex b/Doc/lib/libpyexpat.tex
index 27edc08..b50c52d 100644
--- a/Doc/lib/libpyexpat.tex
+++ b/Doc/lib/libpyexpat.tex
@@ -272,11 +272,11 @@ Start element: parent {'id': 'top'}
 Start element: child1 {'name': 'paul'}
 Character data: 'Text goes here'
 End element: child1
-Character data: '\012'
+Character data: '\n'
 Start element: child2 {'name': 'fred'}
 Character data: 'More text'
 End element: child2
-Character data: '\012'
+Character data: '\n'
 End element: parent
 \end{verbatim}
 
diff --git a/Doc/lib/librotor.tex b/Doc/lib/librotor.tex
index ba7c402..e1db8ef 100644
--- a/Doc/lib/librotor.tex
+++ b/Doc/lib/librotor.tex
@@ -68,17 +68,17 @@ An example usage:
 >>> import rotor
 >>> rt = rotor.newrotor('key', 12)
 >>> rt.encrypt('bar')
-'\2534\363'
+'\xab4\xf3'
 >>> rt.encryptmore('bar')
-'\357\375$'
+'\xef\xfd$'
 >>> rt.encrypt('bar')
-'\2534\363'
->>> rt.decrypt('\2534\363')
+'\xab4\xf3'
+>>> rt.decrypt('\xab4\xf3')
 'bar'
->>> rt.decryptmore('\357\375$')
+>>> rt.decryptmore('\xef\xfd$')
 'bar'
->>> rt.decrypt('\357\375$')
-'l(\315'
+>>> rt.decrypt('\xef\xfd$')
+'l(\xcd'
 >>> del rt
 \end{verbatim}
 
diff --git a/Doc/lib/libstruct.tex b/Doc/lib/libstruct.tex
index 434b433..637d3e6 100644
--- a/Doc/lib/libstruct.tex
+++ b/Doc/lib/libstruct.tex
@@ -168,8 +168,8 @@ big-endian machine):
 \begin{verbatim}
 >>> from struct import *
 >>> pack('hhl', 1, 2, 3)
-'\000\001\000\002\000\000\000\003'
->>> unpack('hhl', '\000\001\000\002\000\000\000\003')
+'\x00\x01\x00\x02\x00\x00\x00\x03'
+>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
 (1, 2, 3)
 >>> calcsize('hhl')
 8
diff --git a/Doc/tut/tut.tex b/Doc/tut/tut.tex
index 86014a8..8a47b22 100644
--- a/Doc/tut/tut.tex
+++ b/Doc/tut/tut.tex
@@ -801,24 +801,24 @@ Apart from these standard encodings, Python provides a whole set of
 other ways of creating Unicode strings on the basis of a known
 encoding. 
 
-The builtin \function{unicode()}\bifuncindex{unicode} provides access
+The built-in function \function{unicode()}\bifuncindex{unicode} provides access
 to all registered Unicode codecs (COders and DECoders). Some of the
 more well known encodings which these codecs can convert are
 \emph{Latin-1}, \emph{ASCII}, \emph{UTF-8} and \emph{UTF-16}. The latter two
-are variable length encodings which permit to store Unicode characters
-in 8 or 16 bits. Python uses UTF-8 as default encoding. This becomes
-noticeable when printing Unicode strings or writing them to files.
+are variable-length encodings which store Unicode characters
+in blocks of 8 or 16 bits. To print a Unicode string or write it to a file,
+you must convert it to a string with the \method{encode()} method.
 
 \begin{verbatim}
 >>> u"���"
 u'\344\366\374'
->>> str(u"���")
+>>> u"���".encode('UTF-8')
 '\303\244\303\266\303\274'
 \end{verbatim}
 
 If you have data in a specific encoding and want to produce a
 corresponding Unicode string from it, you can use the
-\function{unicode()} builtin with the encoding name as second
+\function{unicode()} function with the encoding name as second
 argument.
 
 \begin{verbatim}
@@ -826,14 +826,6 @@ argument.
 u'\344\366\374'
 \end{verbatim}
 
-To convert the Unicode string back into a string using the original
-encoding, the objects provide an \method{encode()} method.
-
-\begin{verbatim}
->>> u"���".encode('UTF-8')
-'\303\244\303\266\303\274'
-\end{verbatim}
-
 
 \subsection{Lists \label{lists}}
 
diff --git a/Lib/test/output/test_cfgparser b/Lib/test/output/test_cfgparser
index 2849905..8d06816 100644
--- a/Lib/test/output/test_cfgparser
+++ b/Lib/test/output/test_cfgparser
@@ -24,18 +24,18 @@ Value interpolation too deeply recursive:
 
 Testing for parsing errors...
 Caught expected exception: File contains parsing errors: <???>
-	[line  2]: '  extra-spaces: splat\012'
+	[line  2]: '  extra-spaces: splat\n'
 Caught expected exception: File contains parsing errors: <???>
-	[line  2]: '  extra-spaces= splat\012'
+	[line  2]: '  extra-spaces= splat\n'
 Caught expected exception: File contains parsing errors: <???>
-	[line  2]: 'option-without-value\012'
+	[line  2]: 'option-without-value\n'
 Caught expected exception: File contains parsing errors: <???>
-	[line  2]: ':value-without-option-name\012'
+	[line  2]: ':value-without-option-name\n'
 Caught expected exception: File contains parsing errors: <???>
-	[line  2]: '=value-without-option-name\012'
+	[line  2]: '=value-without-option-name\n'
 Caught expected exception: File contains no section headers.
 file: <???>, line: 1
-'No Section!\012'
+'No Section!\n'
 
 Testing query interface...
 []
diff --git a/Lib/test/output/test_cookie b/Lib/test/output/test_cookie
index 30b57fe..8ef2ce7 100644
--- a/Lib/test/output/test_cookie
+++ b/Lib/test/output/test_cookie
@@ -6,9 +6,9 @@ Set-Cookie: chips=ahoy;
 Set-Cookie: vienna=finger;
   chips 'ahoy' 'ahoy'
 Set-Cookie: chips=ahoy;
-<SimpleCookie: keebler='E=mc2; L="Loves"; fudge=\012;'>
+<SimpleCookie: keebler='E=mc2; L="Loves"; fudge=\n;'>
 Set-Cookie: keebler="E=mc2; L=\"Loves\"; fudge=\012;";
-  keebler 'E=mc2; L="Loves"; fudge=\012;' 'E=mc2; L="Loves"; fudge=\012;'
+  keebler 'E=mc2; L="Loves"; fudge=\n;' 'E=mc2; L="Loves"; fudge=\n;'
 Set-Cookie: keebler="E=mc2; L=\"Loves\"; fudge=\012;";
 Set-Cookie: Customer="WILE_E_COYOTE"; Path=/acme;
 
diff --git a/Lib/test/output/test_tokenize b/Lib/test/output/test_tokenize
index d2f4eb6..ba7ea6e 100644
--- a/Lib/test/output/test_tokenize
+++ b/Lib/test/output/test_tokenize
@@ -1,26 +1,26 @@
 test_tokenize
-1,0-1,35:	COMMENT	"# Tests for the 'tokenize' module.\012"
-2,0-2,43:	COMMENT	'# Large bits stolen from test_grammar.py. \012'
-3,0-3,1:	NL	'\012'
-4,0-4,11:	COMMENT	'# Comments\012'
+1,0-1,35:	COMMENT	"# Tests for the 'tokenize' module.\n"
+2,0-2,43:	COMMENT	'# Large bits stolen from test_grammar.py. \n'
+3,0-3,1:	NL	'\n'
+4,0-4,11:	COMMENT	'# Comments\n'
 5,0-5,3:	STRING	'"#"'
-5,3-5,4:	NEWLINE	'\012'
-6,0-6,3:	COMMENT	"#'\012"
-7,0-7,3:	COMMENT	'#"\012'
-8,0-8,3:	COMMENT	'#\\\012'
-9,7-9,9:	COMMENT	'#\012'
-10,4-10,10:	COMMENT	'# abc\012'
-11,0-12,4:	STRING	"'''#\012#'''"
-12,4-12,5:	NEWLINE	'\012'
-13,0-13,1:	NL	'\012'
+5,3-5,4:	NEWLINE	'\n'
+6,0-6,3:	COMMENT	"#'\n"
+7,0-7,3:	COMMENT	'#"\n'
+8,0-8,3:	COMMENT	'#\\\n'
+9,7-9,9:	COMMENT	'#\n'
+10,4-10,10:	COMMENT	'# abc\n'
+11,0-12,4:	STRING	"'''#\n#'''"
+12,4-12,5:	NEWLINE	'\n'
+13,0-13,1:	NL	'\n'
 14,0-14,1:	NAME	'x'
 14,2-14,3:	OP	'='
 14,4-14,5:	NUMBER	'1'
 14,7-14,8:	COMMENT	'#'
-14,8-14,9:	NEWLINE	'\012'
-15,0-15,1:	NL	'\012'
-16,0-16,25:	COMMENT	'# Balancing continuation\012'
-17,0-17,1:	NL	'\012'
+14,8-14,9:	NEWLINE	'\n'
+15,0-15,1:	NL	'\n'
+16,0-16,25:	COMMENT	'# Balancing continuation\n'
+17,0-17,1:	NL	'\n'
 18,0-18,1:	NAME	'a'
 18,2-18,3:	OP	'='
 18,4-18,5:	OP	'('
@@ -28,12 +28,12 @@ test_tokenize
 18,6-18,7:	OP	','
 18,8-18,9:	NUMBER	'4'
 18,9-18,10:	OP	','
-18,10-18,11:	NL	'\012'
+18,10-18,11:	NL	'\n'
 19,2-19,3:	NUMBER	'5'
 19,3-19,4:	OP	','
 19,5-19,6:	NUMBER	'6'
 19,6-19,7:	OP	')'
-19,7-19,8:	NEWLINE	'\012'
+19,7-19,8:	NEWLINE	'\n'
 20,0-20,1:	NAME	'y'
 20,2-20,3:	OP	'='
 20,4-20,5:	OP	'['
@@ -41,10 +41,10 @@ test_tokenize
 20,6-20,7:	OP	','
 20,8-20,9:	NUMBER	'4'
 20,9-20,10:	OP	','
-20,10-20,11:	NL	'\012'
+20,10-20,11:	NL	'\n'
 21,2-21,3:	NUMBER	'5'
 21,3-21,4:	OP	']'
-21,4-21,5:	NEWLINE	'\012'
+21,4-21,5:	NEWLINE	'\n'
 22,0-22,1:	NAME	'z'
 22,2-22,3:	OP	'='
 22,4-22,5:	OP	'{'
@@ -52,12 +52,12 @@ test_tokenize
 22,8-22,9:	OP	':'
 22,9-22,10:	NUMBER	'5'
 22,10-22,11:	OP	','
-22,11-22,12:	NL	'\012'
+22,11-22,12:	NL	'\n'
 23,2-23,5:	STRING	"'b'"
 23,5-23,6:	OP	':'
 23,6-23,7:	NUMBER	'6'
 23,7-23,8:	OP	'}'
-23,8-23,9:	NEWLINE	'\012'
+23,8-23,9:	NEWLINE	'\n'
 24,0-24,1:	NAME	'x'
 24,2-24,3:	OP	'='
 24,4-24,5:	OP	'('
@@ -74,151 +74,151 @@ test_tokenize
 24,20-24,21:	OP	'-'
 24,22-24,23:	NAME	'a'
 24,23-24,24:	OP	'['
-24,24-24,25:	NL	'\012'
+24,24-24,25:	NL	'\n'
 25,3-25,4:	NUMBER	'3'
 25,5-25,6:	OP	']'
-25,6-25,7:	NL	'\012'
+25,6-25,7:	NL	'\n'
 26,3-26,4:	OP	'-'
 26,5-26,6:	NAME	'x'
 26,7-26,8:	OP	'+'
 26,9-26,12:	NAME	'len'
 26,12-26,13:	OP	'('
 26,13-26,14:	OP	'{'
-26,14-26,15:	NL	'\012'
+26,14-26,15:	NL	'\n'
 27,3-27,4:	OP	'}'
-27,4-27,5:	NL	'\012'
+27,4-27,5:	NL	'\n'
 28,4-28,5:	OP	')'
-28,5-28,6:	NL	'\012'
+28,5-28,6:	NL	'\n'
 29,2-29,3:	OP	')'
-29,3-29,4:	NEWLINE	'\012'
-30,0-30,1:	NL	'\012'
-31,0-31,37:	COMMENT	'# Backslash means line continuation:\012'
+29,3-29,4:	NEWLINE	'\n'
+30,0-30,1:	NL	'\n'
+31,0-31,37:	COMMENT	'# Backslash means line continuation:\n'
 32,0-32,1:	NAME	'x'
 32,2-32,3:	OP	'='
 32,4-32,5:	NUMBER	'1'
 33,0-33,1:	OP	'+'
 33,2-33,3:	NUMBER	'1'
-33,3-33,4:	NEWLINE	'\012'
-34,0-34,1:	NL	'\012'
-35,0-35,55:	COMMENT	'# Backslash does not means continuation in comments :\\\012'
+33,3-33,4:	NEWLINE	'\n'
+34,0-34,1:	NL	'\n'
+35,0-35,55:	COMMENT	'# Backslash does not means continuation in comments :\\\n'
 36,0-36,1:	NAME	'x'
 36,2-36,3:	OP	'='
 36,4-36,5:	NUMBER	'0'
-36,5-36,6:	NEWLINE	'\012'
-37,0-37,1:	NL	'\012'
-38,0-38,20:	COMMENT	'# Ordinary integers\012'
+36,5-36,6:	NEWLINE	'\n'
+37,0-37,1:	NL	'\n'
+38,0-38,20:	COMMENT	'# Ordinary integers\n'
 39,0-39,4:	NUMBER	'0xff'
 39,5-39,7:	OP	'<>'
 39,8-39,11:	NUMBER	'255'
-39,11-39,12:	NEWLINE	'\012'
+39,11-39,12:	NEWLINE	'\n'
 40,0-40,4:	NUMBER	'0377'
 40,5-40,7:	OP	'<>'
 40,8-40,11:	NUMBER	'255'
-40,11-40,12:	NEWLINE	'\012'
+40,11-40,12:	NEWLINE	'\n'
 41,0-41,10:	NUMBER	'2147483647'
 41,13-41,15:	OP	'!='
 41,16-41,28:	NUMBER	'017777777777'
-41,28-41,29:	NEWLINE	'\012'
+41,28-41,29:	NEWLINE	'\n'
 42,0-42,1:	OP	'-'
 42,1-42,11:	NUMBER	'2147483647'
 42,11-42,12:	OP	'-'
 42,12-42,13:	NUMBER	'1'
 42,14-42,16:	OP	'!='
 42,17-42,29:	NUMBER	'020000000000'
-42,29-42,30:	NEWLINE	'\012'
+42,29-42,30:	NEWLINE	'\n'
 43,0-43,12:	NUMBER	'037777777777'
 43,13-43,15:	OP	'!='
 43,16-43,17:	OP	'-'
 43,17-43,18:	NUMBER	'1'
-43,18-43,19:	NEWLINE	'\012'
+43,18-43,19:	NEWLINE	'\n'
 44,0-44,10:	NUMBER	'0xffffffff'
 44,11-44,13:	OP	'!='
 44,14-44,15:	OP	'-'
 44,15-44,16:	NUMBER	'1'
-44,16-44,17:	NEWLINE	'\012'
-45,0-45,1:	NL	'\012'
-46,0-46,16:	COMMENT	'# Long integers\012'
+44,16-44,17:	NEWLINE	'\n'
+45,0-45,1:	NL	'\n'
+46,0-46,16:	COMMENT	'# Long integers\n'
 47,0-47,1:	NAME	'x'
 47,2-47,3:	OP	'='
 47,4-47,6:	NUMBER	'0L'
-47,6-47,7:	NEWLINE	'\012'
+47,6-47,7:	NEWLINE	'\n'
 48,0-48,1:	NAME	'x'
 48,2-48,3:	OP	'='
 48,4-48,6:	NUMBER	'0l'
-48,6-48,7:	NEWLINE	'\012'
+48,6-48,7:	NEWLINE	'\n'
 49,0-49,1:	NAME	'x'
 49,2-49,3:	OP	'='
 49,4-49,23:	NUMBER	'0xffffffffffffffffL'
-49,23-49,24:	NEWLINE	'\012'
+49,23-49,24:	NEWLINE	'\n'
 50,0-50,1:	NAME	'x'
 50,2-50,3:	OP	'='
 50,4-50,23:	NUMBER	'0xffffffffffffffffl'
-50,23-50,24:	NEWLINE	'\012'
+50,23-50,24:	NEWLINE	'\n'
 51,0-51,1:	NAME	'x'
 51,2-51,3:	OP	'='
 51,4-51,23:	NUMBER	'077777777777777777L'
-51,23-51,24:	NEWLINE	'\012'
+51,23-51,24:	NEWLINE	'\n'
 52,0-52,1:	NAME	'x'
 52,2-52,3:	OP	'='
 52,4-52,23:	NUMBER	'077777777777777777l'
-52,23-52,24:	NEWLINE	'\012'
+52,23-52,24:	NEWLINE	'\n'
 53,0-53,1:	NAME	'x'
 53,2-53,3:	OP	'='
 53,4-53,35:	NUMBER	'123456789012345678901234567890L'
-53,35-53,36:	NEWLINE	'\012'
+53,35-53,36:	NEWLINE	'\n'
 54,0-54,1:	NAME	'x'
 54,2-54,3:	OP	'='
 54,4-54,35:	NUMBER	'123456789012345678901234567890l'
-54,35-54,36:	NEWLINE	'\012'
-55,0-55,1:	NL	'\012'
-56,0-56,25:	COMMENT	'# Floating-point numbers\012'
+54,35-54,36:	NEWLINE	'\n'
+55,0-55,1:	NL	'\n'
+56,0-56,25:	COMMENT	'# Floating-point numbers\n'
 57,0-57,1:	NAME	'x'
 57,2-57,3:	OP	'='
 57,4-57,8:	NUMBER	'3.14'
-57,8-57,9:	NEWLINE	'\012'
+57,8-57,9:	NEWLINE	'\n'
 58,0-58,1:	NAME	'x'
 58,2-58,3:	OP	'='
 58,4-58,8:	NUMBER	'314.'
-58,8-58,9:	NEWLINE	'\012'
+58,8-58,9:	NEWLINE	'\n'
 59,0-59,1:	NAME	'x'
 59,2-59,3:	OP	'='
 59,4-59,9:	NUMBER	'0.314'
-59,9-59,10:	NEWLINE	'\012'
-60,0-60,18:	COMMENT	'# XXX x = 000.314\012'
+59,9-59,10:	NEWLINE	'\n'
+60,0-60,18:	COMMENT	'# XXX x = 000.314\n'
 61,0-61,1:	NAME	'x'
 61,2-61,3:	OP	'='
 61,4-61,8:	NUMBER	'.314'
-61,8-61,9:	NEWLINE	'\012'
+61,8-61,9:	NEWLINE	'\n'
 62,0-62,1:	NAME	'x'
 62,2-62,3:	OP	'='
 62,4-62,8:	NUMBER	'3e14'
-62,8-62,9:	NEWLINE	'\012'
+62,8-62,9:	NEWLINE	'\n'
 63,0-63,1:	NAME	'x'
 63,2-63,3:	OP	'='
 63,4-63,8:	NUMBER	'3E14'
-63,8-63,9:	NEWLINE	'\012'
+63,8-63,9:	NEWLINE	'\n'
 64,0-64,1:	NAME	'x'
 64,2-64,3:	OP	'='
 64,4-64,9:	NUMBER	'3e-14'
-64,9-64,10:	NEWLINE	'\012'
+64,9-64,10:	NEWLINE	'\n'
 65,0-65,1:	NAME	'x'
 65,2-65,3:	OP	'='
 65,4-65,9:	NUMBER	'3e+14'
-65,9-65,10:	NEWLINE	'\012'
+65,9-65,10:	NEWLINE	'\n'
 66,0-66,1:	NAME	'x'
 66,2-66,3:	OP	'='
 66,4-66,9:	NUMBER	'3.e14'
-66,9-66,10:	NEWLINE	'\012'
+66,9-66,10:	NEWLINE	'\n'
 67,0-67,1:	NAME	'x'
 67,2-67,3:	OP	'='
 67,4-67,9:	NUMBER	'.3e14'
-67,9-67,10:	NEWLINE	'\012'
+67,9-67,10:	NEWLINE	'\n'
 68,0-68,1:	NAME	'x'
 68,2-68,3:	OP	'='
 68,4-68,9:	NUMBER	'3.1e4'
-68,9-68,10:	NEWLINE	'\012'
-69,0-69,1:	NL	'\012'
-70,0-70,18:	COMMENT	'# String literals\012'
+68,9-68,10:	NEWLINE	'\n'
+69,0-69,1:	NL	'\n'
+70,0-70,18:	COMMENT	'# String literals\n'
 71,0-71,1:	NAME	'x'
 71,2-71,3:	OP	'='
 71,4-71,6:	STRING	"''"
@@ -227,7 +227,7 @@ test_tokenize
 71,10-71,11:	OP	'='
 71,12-71,14:	STRING	'""'
 71,14-71,15:	OP	';'
-71,15-71,16:	NEWLINE	'\012'
+71,15-71,16:	NEWLINE	'\n'
 72,0-72,1:	NAME	'x'
 72,2-72,3:	OP	'='
 72,4-72,8:	STRING	"'\\''"
@@ -236,7 +236,7 @@ test_tokenize
 72,12-72,13:	OP	'='
 72,14-72,17:	STRING	'"\'"'
 72,17-72,18:	OP	';'
-72,18-72,19:	NEWLINE	'\012'
+72,18-72,19:	NEWLINE	'\n'
 73,0-73,1:	NAME	'x'
 73,2-73,3:	OP	'='
 73,4-73,7:	STRING	'\'"\''
@@ -245,82 +245,82 @@ test_tokenize
 73,11-73,12:	OP	'='
 73,13-73,17:	STRING	'"\\""'
 73,17-73,18:	OP	';'
-73,18-73,19:	NEWLINE	'\012'
+73,18-73,19:	NEWLINE	'\n'
 74,0-74,1:	NAME	'x'
 74,2-74,3:	OP	'='
 74,4-74,32:	STRING	'"doesn\'t \\"shrink\\" does it"'
-74,32-74,33:	NEWLINE	'\012'
+74,32-74,33:	NEWLINE	'\n'
 75,0-75,1:	NAME	'y'
 75,2-75,3:	OP	'='
 75,4-75,31:	STRING	'\'doesn\\\'t "shrink" does it\''
-75,31-75,32:	NEWLINE	'\012'
+75,31-75,32:	NEWLINE	'\n'
 76,0-76,1:	NAME	'x'
 76,2-76,3:	OP	'='
 76,4-76,32:	STRING	'"does \\"shrink\\" doesn\'t it"'
-76,32-76,33:	NEWLINE	'\012'
+76,32-76,33:	NEWLINE	'\n'
 77,0-77,1:	NAME	'y'
 77,2-77,3:	OP	'='
 77,4-77,31:	STRING	'\'does "shrink" doesn\\\'t it\''
-77,31-77,32:	NEWLINE	'\012'
+77,31-77,32:	NEWLINE	'\n'
 78,0-78,1:	NAME	'x'
 78,2-78,3:	OP	'='
-78,4-83,3:	STRING	'"""\012The "quick"\012brown fox\012jumps over\012the \'lazy\' dog.\012"""'
-83,3-83,4:	NEWLINE	'\012'
+78,4-83,3:	STRING	'"""\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n"""'
+83,3-83,4:	NEWLINE	'\n'
 84,0-84,1:	NAME	'y'
 84,2-84,3:	OP	'='
 84,4-84,63:	STRING	'\'\\nThe "quick"\\nbrown fox\\njumps over\\nthe \\\'lazy\\\' dog.\\n\''
-84,63-84,64:	NEWLINE	'\012'
+84,63-84,64:	NEWLINE	'\n'
 85,0-85,1:	NAME	'y'
 85,2-85,3:	OP	'='
-85,4-90,3:	STRING	'\'\'\'\012The "quick"\012brown fox\012jumps over\012the \'lazy\' dog.\012\'\'\''
+85,4-90,3:	STRING	'\'\'\'\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n\'\'\''
 90,3-90,4:	OP	';'
-90,4-90,5:	NEWLINE	'\012'
+90,4-90,5:	NEWLINE	'\n'
 91,0-91,1:	NAME	'y'
 91,2-91,3:	OP	'='
-91,4-96,1:	STRING	'"\\n\\\012The \\"quick\\"\\n\\\012brown fox\\n\\\012jumps over\\n\\\012the \'lazy\' dog.\\n\\\012"'
+91,4-96,1:	STRING	'"\\n\\\nThe \\"quick\\"\\n\\\nbrown fox\\n\\\njumps over\\n\\\nthe \'lazy\' dog.\\n\\\n"'
 96,1-96,2:	OP	';'
-96,2-96,3:	NEWLINE	'\012'
+96,2-96,3:	NEWLINE	'\n'
 97,0-97,1:	NAME	'y'
 97,2-97,3:	OP	'='
-97,4-102,1:	STRING	'\'\\n\\\012The \\"quick\\"\\n\\\012brown fox\\n\\\012jumps over\\n\\\012the \\\'lazy\\\' dog.\\n\\\012\''
+97,4-102,1:	STRING	'\'\\n\\\nThe \\"quick\\"\\n\\\nbrown fox\\n\\\njumps over\\n\\\nthe \\\'lazy\\\' dog.\\n\\\n\''
 102,1-102,2:	OP	';'
-102,2-102,3:	NEWLINE	'\012'
+102,2-102,3:	NEWLINE	'\n'
 103,0-103,1:	NAME	'x'
 103,2-103,3:	OP	'='
 103,4-103,9:	STRING	"r'\\\\'"
 103,10-103,11:	OP	'+'
 103,12-103,17:	STRING	"R'\\\\'"
-103,17-103,18:	NEWLINE	'\012'
+103,17-103,18:	NEWLINE	'\n'
 104,0-104,1:	NAME	'x'
 104,2-104,3:	OP	'='
 104,4-104,9:	STRING	"r'\\''"
 104,10-104,11:	OP	'+'
 104,12-104,14:	STRING	"''"
-104,14-104,15:	NEWLINE	'\012'
+104,14-104,15:	NEWLINE	'\n'
 105,0-105,1:	NAME	'y'
 105,2-105,3:	OP	'='
-105,4-107,6:	STRING	"r'''\012foo bar \\\\\012baz'''"
+105,4-107,6:	STRING	"r'''\nfoo bar \\\\\nbaz'''"
 107,7-107,8:	OP	'+'
-107,9-108,6:	STRING	"R'''\012foo'''"
-108,6-108,7:	NEWLINE	'\012'
+107,9-108,6:	STRING	"R'''\nfoo'''"
+108,6-108,7:	NEWLINE	'\n'
 109,0-109,1:	NAME	'y'
 109,2-109,3:	OP	'='
-109,4-111,3:	STRING	'r"""foo\012bar \\\\ baz\012"""'
+109,4-111,3:	STRING	'r"""foo\nbar \\\\ baz\n"""'
 111,4-111,5:	OP	'+'
-111,6-112,3:	STRING	"R'''spam\012'''"
-112,3-112,4:	NEWLINE	'\012'
+111,6-112,3:	STRING	"R'''spam\n'''"
+112,3-112,4:	NEWLINE	'\n'
 113,0-113,1:	NAME	'x'
 113,2-113,3:	OP	'='
 113,4-113,10:	STRING	"u'abc'"
 113,11-113,12:	OP	'+'
 113,13-113,19:	STRING	"U'ABC'"
-113,19-113,20:	NEWLINE	'\012'
+113,19-113,20:	NEWLINE	'\n'
 114,0-114,1:	NAME	'y'
 114,2-114,3:	OP	'='
 114,4-114,10:	STRING	'u"abc"'
 114,11-114,12:	OP	'+'
 114,13-114,19:	STRING	'U"ABC"'
-114,19-114,20:	NEWLINE	'\012'
+114,19-114,20:	NEWLINE	'\n'
 115,0-115,1:	NAME	'x'
 115,2-115,3:	OP	'='
 115,4-115,11:	STRING	"ur'abc'"
@@ -330,7 +330,7 @@ test_tokenize
 115,24-115,31:	STRING	"uR'ABC'"
 115,32-115,33:	OP	'+'
 115,34-115,41:	STRING	"UR'ABC'"
-115,41-115,42:	NEWLINE	'\012'
+115,41-115,42:	NEWLINE	'\n'
 116,0-116,1:	NAME	'y'
 116,2-116,3:	OP	'='
 116,4-116,11:	STRING	'ur"abc"'
@@ -340,106 +340,106 @@ test_tokenize
 116,24-116,31:	STRING	'uR"ABC"'
 116,32-116,33:	OP	'+'
 116,34-116,41:	STRING	'UR"ABC"'
-116,41-116,42:	NEWLINE	'\012'
+116,41-116,42:	NEWLINE	'\n'
 117,0-117,1:	NAME	'x'
 117,2-117,3:	OP	'='
 117,4-117,10:	STRING	"ur'\\\\'"
 117,11-117,12:	OP	'+'
 117,13-117,19:	STRING	"UR'\\\\'"
-117,19-117,20:	NEWLINE	'\012'
+117,19-117,20:	NEWLINE	'\n'
 118,0-118,1:	NAME	'x'
 118,2-118,3:	OP	'='
 118,4-118,10:	STRING	"ur'\\''"
 118,11-118,12:	OP	'+'
 118,13-118,15:	STRING	"''"
-118,15-118,16:	NEWLINE	'\012'
+118,15-118,16:	NEWLINE	'\n'
 119,0-119,1:	NAME	'y'
 119,2-119,3:	OP	'='
-119,4-121,6:	STRING	"ur'''\012foo bar \\\\\012baz'''"
+119,4-121,6:	STRING	"ur'''\nfoo bar \\\\\nbaz'''"
 121,7-121,8:	OP	'+'
-121,9-122,6:	STRING	"UR'''\012foo'''"
-122,6-122,7:	NEWLINE	'\012'
+121,9-122,6:	STRING	"UR'''\nfoo'''"
+122,6-122,7:	NEWLINE	'\n'
 123,0-123,1:	NAME	'y'
 123,2-123,3:	OP	'='
-123,4-125,3:	STRING	'Ur"""foo\012bar \\\\ baz\012"""'
+123,4-125,3:	STRING	'Ur"""foo\nbar \\\\ baz\n"""'
 125,4-125,5:	OP	'+'
-125,6-126,3:	STRING	"uR'''spam\012'''"
-126,3-126,4:	NEWLINE	'\012'
-127,0-127,1:	NL	'\012'
-128,0-128,14:	COMMENT	'# Indentation\012'
+125,6-126,3:	STRING	"uR'''spam\n'''"
+126,3-126,4:	NEWLINE	'\n'
+127,0-127,1:	NL	'\n'
+128,0-128,14:	COMMENT	'# Indentation\n'
 129,0-129,2:	NAME	'if'
 129,3-129,4:	NUMBER	'1'
 129,4-129,5:	OP	':'
-129,5-129,6:	NEWLINE	'\012'
+129,5-129,6:	NEWLINE	'\n'
 130,0-130,4:	INDENT	'    '
 130,4-130,5:	NAME	'x'
 130,6-130,7:	OP	'='
 130,8-130,9:	NUMBER	'2'
-130,9-130,10:	NEWLINE	'\012'
+130,9-130,10:	NEWLINE	'\n'
 131,0-131,0:	DEDENT	''
 131,0-131,2:	NAME	'if'
 131,3-131,4:	NUMBER	'1'
 131,4-131,5:	OP	':'
-131,5-131,6:	NEWLINE	'\012'
+131,5-131,6:	NEWLINE	'\n'
 132,0-132,8:	INDENT	'        '
 132,8-132,9:	NAME	'x'
 132,10-132,11:	OP	'='
 132,12-132,13:	NUMBER	'2'
-132,13-132,14:	NEWLINE	'\012'
+132,13-132,14:	NEWLINE	'\n'
 133,0-133,0:	DEDENT	''
 133,0-133,2:	NAME	'if'
 133,3-133,4:	NUMBER	'1'
 133,4-133,5:	OP	':'
-133,5-133,6:	NEWLINE	'\012'
+133,5-133,6:	NEWLINE	'\n'
 134,0-134,4:	INDENT	'    '
 134,4-134,9:	NAME	'while'
 134,10-134,11:	NUMBER	'0'
 134,11-134,12:	OP	':'
-134,12-134,13:	NEWLINE	'\012'
+134,12-134,13:	NEWLINE	'\n'
 135,0-135,5:	INDENT	'     '
 135,5-135,7:	NAME	'if'
 135,8-135,9:	NUMBER	'0'
 135,9-135,10:	OP	':'
-135,10-135,11:	NEWLINE	'\012'
+135,10-135,11:	NEWLINE	'\n'
 136,0-136,11:	INDENT	'           '
 136,11-136,12:	NAME	'x'
 136,13-136,14:	OP	'='
 136,15-136,16:	NUMBER	'2'
-136,16-136,17:	NEWLINE	'\012'
+136,16-136,17:	NEWLINE	'\n'
 137,5-137,5:	DEDENT	''
 137,5-137,6:	NAME	'x'
 137,7-137,8:	OP	'='
 137,9-137,10:	NUMBER	'2'
-137,10-137,11:	NEWLINE	'\012'
+137,10-137,11:	NEWLINE	'\n'
 138,0-138,0:	DEDENT	''
 138,0-138,0:	DEDENT	''
 138,0-138,2:	NAME	'if'
 138,3-138,4:	NUMBER	'0'
 138,4-138,5:	OP	':'
-138,5-138,6:	NEWLINE	'\012'
+138,5-138,6:	NEWLINE	'\n'
 139,0-139,2:	INDENT	'  '
 139,2-139,4:	NAME	'if'
 139,5-139,6:	NUMBER	'2'
 139,6-139,7:	OP	':'
-139,7-139,8:	NEWLINE	'\012'
+139,7-139,8:	NEWLINE	'\n'
 140,0-140,3:	INDENT	'   '
 140,3-140,8:	NAME	'while'
 140,9-140,10:	NUMBER	'0'
 140,10-140,11:	OP	':'
-140,11-140,12:	NEWLINE	'\012'
+140,11-140,12:	NEWLINE	'\n'
 141,0-141,8:	INDENT	'        '
 141,8-141,10:	NAME	'if'
 141,11-141,12:	NUMBER	'1'
 141,12-141,13:	OP	':'
-141,13-141,14:	NEWLINE	'\012'
+141,13-141,14:	NEWLINE	'\n'
 142,0-142,10:	INDENT	'          '
 142,10-142,11:	NAME	'x'
 142,12-142,13:	OP	'='
 142,14-142,15:	NUMBER	'2'
-142,15-142,16:	NEWLINE	'\012'
-143,0-143,1:	NL	'\012'
-144,0-144,12:	COMMENT	'# Operators\012'
-145,0-145,1:	NL	'\012'
+142,15-142,16:	NEWLINE	'\n'
+143,0-143,1:	NL	'\n'
+144,0-144,12:	COMMENT	'# Operators\n'
+145,0-145,1:	NL	'\n'
 146,0-146,0:	DEDENT	''
 146,0-146,0:	DEDENT	''
 146,0-146,0:	DEDENT	''
@@ -461,7 +461,7 @@ test_tokenize
 146,22-146,23:	OP	')'
 146,23-146,24:	OP	':'
 146,25-146,29:	NAME	'pass'
-146,29-146,30:	NEWLINE	'\012'
+146,29-146,30:	NEWLINE	'\n'
 147,0-147,3:	NAME	'def'
 147,4-147,8:	NAME	'd01v'
 147,8-147,9:	OP	'('
@@ -477,8 +477,8 @@ test_tokenize
 147,27-147,28:	OP	')'
 147,28-147,29:	OP	':'
 147,30-147,34:	NAME	'pass'
-147,34-147,35:	NEWLINE	'\012'
-148,0-148,1:	NL	'\012'
+147,34-147,35:	NEWLINE	'\n'
+148,0-148,1:	NL	'\n'
 149,0-149,1:	OP	'('
 149,1-149,2:	NAME	'x'
 149,2-149,3:	OP	','
@@ -498,9 +498,9 @@ test_tokenize
 149,25-149,26:	NUMBER	'2'
 149,26-149,27:	OP	'}'
 149,27-149,28:	OP	')'
-149,28-149,29:	NEWLINE	'\012'
-150,0-150,1:	NL	'\012'
-151,0-151,13:	COMMENT	'# comparison\012'
+149,28-149,29:	NEWLINE	'\n'
+150,0-150,1:	NL	'\n'
+151,0-151,13:	COMMENT	'# comparison\n'
 152,0-152,2:	NAME	'if'
 152,3-152,4:	NUMBER	'1'
 152,5-152,6:	OP	'<'
@@ -529,29 +529,29 @@ test_tokenize
 152,64-152,65:	NUMBER	'1'
 152,65-152,66:	OP	':'
 152,67-152,71:	NAME	'pass'
-152,71-152,72:	NEWLINE	'\012'
-153,0-153,1:	NL	'\012'
-154,0-154,9:	COMMENT	'# binary\012'
+152,71-152,72:	NEWLINE	'\n'
+153,0-153,1:	NL	'\n'
+154,0-154,9:	COMMENT	'# binary\n'
 155,0-155,1:	NAME	'x'
 155,2-155,3:	OP	'='
 155,4-155,5:	NUMBER	'1'
 155,6-155,7:	OP	'&'
 155,8-155,9:	NUMBER	'1'
-155,9-155,10:	NEWLINE	'\012'
+155,9-155,10:	NEWLINE	'\n'
 156,0-156,1:	NAME	'x'
 156,2-156,3:	OP	'='
 156,4-156,5:	NUMBER	'1'
 156,6-156,7:	OP	'^'
 156,8-156,9:	NUMBER	'1'
-156,9-156,10:	NEWLINE	'\012'
+156,9-156,10:	NEWLINE	'\n'
 157,0-157,1:	NAME	'x'
 157,2-157,3:	OP	'='
 157,4-157,5:	NUMBER	'1'
 157,6-157,7:	OP	'|'
 157,8-157,9:	NUMBER	'1'
-157,9-157,10:	NEWLINE	'\012'
-158,0-158,1:	NL	'\012'
-159,0-159,8:	COMMENT	'# shift\012'
+157,9-157,10:	NEWLINE	'\n'
+158,0-158,1:	NL	'\n'
+159,0-159,8:	COMMENT	'# shift\n'
 160,0-160,1:	NAME	'x'
 160,2-160,3:	OP	'='
 160,4-160,5:	NUMBER	'1'
@@ -559,9 +559,9 @@ test_tokenize
 160,9-160,10:	NUMBER	'1'
 160,11-160,13:	OP	'>>'
 160,14-160,15:	NUMBER	'1'
-160,15-160,16:	NEWLINE	'\012'
-161,0-161,1:	NL	'\012'
-162,0-162,11:	COMMENT	'# additive\012'
+160,15-160,16:	NEWLINE	'\n'
+161,0-161,1:	NL	'\n'
+162,0-162,11:	COMMENT	'# additive\n'
 163,0-163,1:	NAME	'x'
 163,2-163,3:	OP	'='
 163,4-163,5:	NUMBER	'1'
@@ -573,9 +573,9 @@ test_tokenize
 163,16-163,17:	NUMBER	'1'
 163,18-163,19:	OP	'+'
 163,20-163,21:	NUMBER	'1'
-163,21-163,22:	NEWLINE	'\012'
-164,0-164,1:	NL	'\012'
-165,0-165,17:	COMMENT	'# multiplicative\012'
+163,21-163,22:	NEWLINE	'\n'
+164,0-164,1:	NL	'\n'
+165,0-165,17:	COMMENT	'# multiplicative\n'
 166,0-166,1:	NAME	'x'
 166,2-166,3:	OP	'='
 166,4-166,5:	NUMBER	'1'
@@ -585,9 +585,9 @@ test_tokenize
 166,12-166,13:	NUMBER	'1'
 166,14-166,15:	OP	'%'
 166,16-166,17:	NUMBER	'1'
-166,17-166,18:	NEWLINE	'\012'
-167,0-167,1:	NL	'\012'
-168,0-168,8:	COMMENT	'# unary\012'
+166,17-166,18:	NEWLINE	'\n'
+167,0-167,1:	NL	'\n'
+168,0-168,8:	COMMENT	'# unary\n'
 169,0-169,1:	NAME	'x'
 169,2-169,3:	OP	'='
 169,4-169,5:	OP	'~'
@@ -603,7 +603,7 @@ test_tokenize
 169,23-169,24:	OP	'^'
 169,25-169,26:	OP	'-'
 169,26-169,27:	NUMBER	'1'
-169,27-169,28:	NEWLINE	'\012'
+169,27-169,28:	NEWLINE	'\n'
 170,0-170,1:	NAME	'x'
 170,2-170,3:	OP	'='
 170,4-170,5:	OP	'-'
@@ -623,14 +623,14 @@ test_tokenize
 170,22-170,23:	NUMBER	'1'
 170,23-170,24:	OP	'*'
 170,24-170,25:	NUMBER	'1'
-170,25-170,26:	NEWLINE	'\012'
-171,0-171,1:	NL	'\012'
-172,0-172,11:	COMMENT	'# selector\012'
+170,25-170,26:	NEWLINE	'\n'
+171,0-171,1:	NL	'\n'
+172,0-172,11:	COMMENT	'# selector\n'
 173,0-173,6:	NAME	'import'
 173,7-173,10:	NAME	'sys'
 173,10-173,11:	OP	','
 173,12-173,16:	NAME	'time'
-173,16-173,17:	NEWLINE	'\012'
+173,16-173,17:	NEWLINE	'\n'
 174,0-174,1:	NAME	'x'
 174,2-174,3:	OP	'='
 174,4-174,7:	NAME	'sys'
@@ -643,6 +643,6 @@ test_tokenize
 174,24-174,28:	NAME	'time'
 174,28-174,29:	OP	'('
 174,29-174,30:	OP	')'
-174,30-174,31:	NEWLINE	'\012'
-175,0-175,1:	NL	'\012'
+174,30-174,31:	NEWLINE	'\n'
+175,0-175,1:	NL	'\n'
 176,0-176,0:	ENDMARKER	''
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index df3ab49..9cf64ba 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -335,8 +335,14 @@ string_print(PyStringObject *op, FILE *fp, int flags)
 		c = op->ob_sval[i];
 		if (c == quote || c == '\\')
 			fprintf(fp, "\\%c", c);
-		else if (c < ' ' || c >= 0177)
-			fprintf(fp, "\\%03o", c & 0377);
+                else if (c == '\t')
+                        fprintf(fp, "\\t");
+                else if (c == '\n')
+                        fprintf(fp, "\\n");
+                else if (c == '\r')
+                        fprintf(fp, "\\r");
+		else if (c < ' ' || c >= 0x7f)
+			fprintf(fp, "\\x%02x", c & 0xff);
 		else
 			fputc(c, fp);
 	}
@@ -374,10 +380,15 @@ string_repr(register PyStringObject *op)
 			c = op->ob_sval[i];
 			if (c == quote || c == '\\')
 				*p++ = '\\', *p++ = c;
-			else if (c < ' ' || c >= 0177) {
-				sprintf(p, "\\%03o", c & 0377);
-				while (*p != '\0')
-					p++;
+			else if (c == '\t')
+				*p++ = '\\', *p++ = 't';
+			else if (c == '\n')
+				*p++ = '\\', *p++ = 'n';
+			else if (c == '\r')
+				*p++ = '\\', *p++ = 'r';
+			else if (c < ' ' || c >= 0x7f) {
+				sprintf(p, "\\x%02x", c & 0xff);
+                                p += 4;
 			}
 			else
 				*p++ = c;
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 39ea071..5c193dd 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -1343,7 +1343,7 @@ PyObject *unicodeescape_string(const Py_UNICODE *s,
     char *p;
     char *q;
 
-    static const char *hexdigit = "0123456789ABCDEF";
+    static const char *hexdigit = "0123456789abcdef";
 
     repr = PyString_FromStringAndSize(NULL, 2 + 6*size + 1);
     if (repr == NULL)
@@ -1372,12 +1372,25 @@ PyObject *unicodeescape_string(const Py_UNICODE *s,
             *p++ = hexdigit[(ch >> 4) & 0xf];
             *p++ = hexdigit[ch & 15];
         }
-        /* Map non-printable US ASCII to '\ooo' */
+        /* Map special whitespace to '\t', \n', '\r' */
+        else if (ch == '\t') {
+            *p++ = '\\';
+            *p++ = 't';
+        }
+        else if (ch == '\n') {
+            *p++ = '\\';
+            *p++ = 'n';
+        }
+        else if (ch == '\r') {
+            *p++ = '\\';
+            *p++ = 'r';
+        }
+        /* Map non-printable US ASCII to '\xhh' */
         else if (ch < ' ' || ch >= 128) {
             *p++ = '\\';
-            *p++ = hexdigit[(ch >> 6) & 7];
-            *p++ = hexdigit[(ch >> 3) & 7];
-            *p++ = hexdigit[ch & 7];
+            *p++ = 'x';
+            *p++ = hexdigit[(ch >> 4) & 0xf];
+            *p++ = hexdigit[ch & 15];
         } 
         /* Copy everything else as-is */
         else
@@ -1498,7 +1511,7 @@ PyObject *PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s,
     char *p;
     char *q;
 
-    static const char *hexdigit = "0123456789ABCDEF";
+    static const char *hexdigit = "0123456789abcdef";
 
     repr = PyString_FromStringAndSize(NULL, 6 * size);
     if (repr == NULL)
-- 
cgit v0.12

