mirror of
https://github.com/python/cpython.git
synced 2025-08-24 10:45:53 +00:00
libpython: implementation of os.fsencode() with surrogateescape error handler
This commit is contained in:
parent
e0f3268715
commit
6ffbee77dc
1 changed files with 20 additions and 2 deletions
|
@ -96,6 +96,23 @@ def write_unicode(file, text):
|
||||||
text = text.encode(ENCODING, 'backslashreplace')
|
text = text.encode(ENCODING, 'backslashreplace')
|
||||||
file.write(text)
|
file.write(text)
|
||||||
|
|
||||||
|
def os_fsencode(filename):
|
||||||
|
if not isinstance(filename, unicode):
|
||||||
|
return filename
|
||||||
|
encoding = sys.getfilesystemencoding()
|
||||||
|
if encoding == 'mbcs':
|
||||||
|
# mbcs doesn't support surrogateescape
|
||||||
|
return filename.encode(encoding)
|
||||||
|
encoded = []
|
||||||
|
for char in filename:
|
||||||
|
# surrogateescape error handler
|
||||||
|
if 0xDC80 <= ord(char) <= 0xDCFF:
|
||||||
|
byte = chr(ord(char) - 0xDC00)
|
||||||
|
else:
|
||||||
|
byte = char.encode(encoding)
|
||||||
|
encoded.append(byte)
|
||||||
|
return ''.join(encoded)
|
||||||
|
|
||||||
class StringTruncated(RuntimeError):
|
class StringTruncated(RuntimeError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -887,7 +904,8 @@ class PyFrameObjectPtr(PyObjectPtr):
|
||||||
newline character'''
|
newline character'''
|
||||||
if self.is_optimized_out():
|
if self.is_optimized_out():
|
||||||
return '(frame information optimized out)'
|
return '(frame information optimized out)'
|
||||||
with open(self.filename(), 'r') as f:
|
filename = self.filename()
|
||||||
|
with open(os_fsencode(filename), 'r') as f:
|
||||||
all_lines = f.readlines()
|
all_lines = f.readlines()
|
||||||
# Convert from 1-based current_line_num to 0-based list offset:
|
# Convert from 1-based current_line_num to 0-based list offset:
|
||||||
return all_lines[self.current_line_num()-1]
|
return all_lines[self.current_line_num()-1]
|
||||||
|
@ -1463,7 +1481,7 @@ class PyList(gdb.Command):
|
||||||
if start<1:
|
if start<1:
|
||||||
start = 1
|
start = 1
|
||||||
|
|
||||||
with open(filename, 'r') as f:
|
with open(os_fsencode(filename), 'r') as f:
|
||||||
all_lines = f.readlines()
|
all_lines = f.readlines()
|
||||||
# start and end are 1-based, all_lines is 0-based;
|
# start and end are 1-based, all_lines is 0-based;
|
||||||
# so [start-1:end] as a python slice gives us [start, end] as a
|
# so [start-1:end] as a python slice gives us [start, end] as a
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue