Commit ef8b654b authored by Mark Hammond's avatar Mark Hammond

Add support for Windows using "mbcs" as the default Unicode encoding when...

Add support for Windows using "mbcs" as the default Unicode encoding when dealing with the file system.  As discussed on python-dev and in patch 410465.
parent 342c65e1
...@@ -404,21 +404,12 @@ def normpath(path): ...@@ -404,21 +404,12 @@ def normpath(path):
# Return an absolute path. # Return an absolute path.
def abspath(path): def abspath(path):
"""Return the absolute version of a path""" """Return the absolute version of a path"""
try:
import win32api
except ImportError:
global abspath
def _abspath(path):
if not isabs(path):
path = join(os.getcwd(), path)
return normpath(path)
abspath = _abspath
return _abspath(path)
if path: # Empty path must return current working directory. if path: # Empty path must return current working directory.
from nt import _getfullpathname
try: try:
path = win32api.GetFullPathName(path) path = _getfullpathname(path)
except win32api.error: except WindowsError:
pass # Bad path - return unchanged. pass # Bad path - return unchanged.
else: else:
path = os.getcwd() path = os.getcwd()
return normpath(path) return normpath(path)
test_unicode_file
All the Unicode tests appeared to work
...@@ -63,6 +63,10 @@ if os.name == 'java': ...@@ -63,6 +63,10 @@ if os.name == 'java':
TESTFN = '$test' TESTFN = '$test'
elif os.name != 'riscos': elif os.name != 'riscos':
TESTFN = '@test' TESTFN = '@test'
# Unicode name only used if TEST_FN_ENCODING exists for the platform.
TESTFN_UNICODE=u"@test-\xe0\xf2" # 2 latin characters.
if os.name=="nt":
TESTFN_ENCODING="mbcs"
else: else:
TESTFN = 'test' TESTFN = 'test'
del os del os
......
# Test some Unicode file name semantics
# We dont test many operations on files other than
# that their names can be used with Unicode characters.
import os
from test_support import verify, TestSkipped, TESTFN_UNICODE
try:
from test_support import TESTFN_ENCODING
except ImportError:
raise TestSkipped("No Unicode filesystem semantics on this platform.")
TESTFN_ENCODED = TESTFN_UNICODE.encode(TESTFN_ENCODING)
# Check with creation as Unicode string.
f = open(TESTFN_UNICODE, 'wb')
if not os.path.isfile(TESTFN_UNICODE):
print "File doesn't exist after creating it"
if not os.path.isfile(TESTFN_ENCODED):
print "File doesn't exist (encoded string) after creating it"
f.close()
# Test stat and chmod
if os.stat(TESTFN_ENCODED) != os.stat(TESTFN_UNICODE):
print "os.stat() did not agree on the 2 filenames"
os.chmod(TESTFN_ENCODED, 0777)
os.chmod(TESTFN_UNICODE, 0777)
# Test rename
os.rename(TESTFN_ENCODED, TESTFN_ENCODED + ".new")
os.rename(TESTFN_UNICODE+".new", TESTFN_ENCODED)
os.unlink(TESTFN_ENCODED)
if os.path.isfile(TESTFN_ENCODED) or \
os.path.isfile(TESTFN_UNICODE):
print "File exists after deleting it"
# Check with creation as encoded string.
f = open(TESTFN_ENCODED, 'wb')
if not os.path.isfile(TESTFN_UNICODE) or \
not os.path.isfile(TESTFN_ENCODED):
print "File doesn't exist after creating it"
path, base = os.path.split(os.path.abspath(TESTFN_ENCODED))
if base not in os.listdir(path):
print "Filename did not appear in os.listdir()"
f.close()
os.unlink(TESTFN_UNICODE)
if os.path.isfile(TESTFN_ENCODED) or \
os.path.isfile(TESTFN_UNICODE):
print "File exists after deleting it"
# test os.open
f = os.open(TESTFN_ENCODED, os.O_CREAT)
if not os.path.isfile(TESTFN_UNICODE) or \
not os.path.isfile(TESTFN_ENCODED):
print "File doesn't exist after creating it"
os.close(f)
os.unlink(TESTFN_UNICODE)
# Test directories etc
cwd = os.getcwd()
abs_encoded = os.path.abspath(TESTFN_ENCODED) + ".dir"
abs_unicode = os.path.abspath(TESTFN_UNICODE) + ".dir"
os.mkdir(abs_encoded)
try:
os.chdir(abs_encoded)
os.chdir(abs_unicode)
finally:
os.chdir(cwd)
os.rmdir(abs_unicode)
os.mkdir(abs_unicode)
try:
os.chdir(abs_encoded)
os.chdir(abs_unicode)
finally:
os.chdir(cwd)
os.rmdir(abs_encoded)
print "All the Unicode tests appeared to work"
This diff is collapsed.
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
extern const char *Py_FileSystemDefaultEncoding;
/* Forward */ /* Forward */
static PyObject *filterstring(PyObject *, PyObject *); static PyObject *filterstring(PyObject *, PyObject *);
static PyObject *filtertuple (PyObject *, PyObject *); static PyObject *filtertuple (PyObject *, PyObject *);
...@@ -1530,14 +1532,16 @@ Return the octal representation of an integer or long integer."; ...@@ -1530,14 +1532,16 @@ Return the octal representation of an integer or long integer.";
static PyObject * static PyObject *
builtin_open(PyObject *self, PyObject *args) builtin_open(PyObject *self, PyObject *args)
{ {
char *name; char *name = NULL;
char *mode = "r"; char *mode = "r";
int bufsize = -1; int bufsize = -1;
PyObject *f; PyObject *f;
if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize)) if (!PyArg_ParseTuple(args, "et|si:open", Py_FileSystemDefaultEncoding,
&name, &mode, &bufsize))
return NULL; return NULL;
f = PyFile_FromString(name, mode); f = PyFile_FromString(name, mode);
PyMem_Free(name); /* free the encoded string */
if (f != NULL) if (f != NULL)
PyFile_SetBufSize(f, bufsize); PyFile_SetBufSize(f, bufsize);
return f; return f;
......
...@@ -698,7 +698,7 @@ convertsimple1(PyObject *arg, char **p_format, va_list *p_va) ...@@ -698,7 +698,7 @@ convertsimple1(PyObject *arg, char **p_format, va_list *p_va)
's' (recode all objects via Unicode) or 's' (recode all objects via Unicode) or
't' (only recode non-string objects) 't' (only recode non-string objects)
*/ */
if (*format != 's') if (*format == 's')
recode_strings = 1; recode_strings = 1;
else if (*format == 't') else if (*format == 't')
recode_strings = 0; recode_strings = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment