[Jython-checkins] jython: Args in sys.argv are now unicode if characters > 127

jim.baker jython-checkins at python.org
Thu Jan 15 03:08:38 CET 2015


https://hg.python.org/jython/rev/d3473cb18d9e
changeset:   7531:d3473cb18d9e
user:        Jim Baker <jim.baker at rackspace.com>
date:        Wed Jan 14 19:08:24 2015 -0700
summary:
  Args in sys.argv are now unicode if characters > 127

As was seen in similar fixes for os.environ and os.listdir, Java
presents command line arguments as java.lang.String, with additional
encoding. For each argument in sys.argv, convert to str if ascii
(maintaining current behavior), otherwise unicode.

Fixes http://bugs.jython.org/issue2252

files:
  Lib/test/test_sys_jy.py                |  27 ++++++++++---
  src/org/python/core/PySystemState.java |   2 +-
  2 files changed, 22 insertions(+), 7 deletions(-)


diff --git a/Lib/test/test_sys_jy.py b/Lib/test/test_sys_jy.py
--- a/Lib/test/test_sys_jy.py
+++ b/Lib/test/test_sys_jy.py
@@ -2,6 +2,7 @@
 from __future__ import with_statement
 import os
 import re
+import subprocess
 import sys
 import tempfile
 import unittest
@@ -240,15 +241,29 @@
         self.assertEqual(check(0xa2, None, "backslashreplace"), r"\xa2")
         self.assertEqual(check(0xa2, "cp850"), "\xbd")
 
+class SysArgvTest(unittest.TestCase):
+    def test_unicode_argv(self):
+        """Unicode roundtrips successfully through sys.argv arguments"""
+        zhongwen = u'\u4e2d\u6587'
+        with test_support.temp_cwd(name=u"tempcwd-%s" % zhongwen):
+            p = subprocess.Popen(
+                [sys.executable, '-c',
+                 'import sys;' \
+                 'sys.stdout.write(sys.argv[1].encode("utf-8"))',
+                 zhongwen],
+                stdout=subprocess.PIPE)
+            self.assertEqual(p.stdout.read().decode("utf-8"), zhongwen)
+
 
 def test_main():
     test_support.run_unittest(
-                              SysTest,
-                              ShadowingTest,
-                              SyspathResourceTest,
-                              SyspathUnicodeTest,
-                              SysEncodingTest,
-                             )
+        SysTest,
+        ShadowingTest,
+        SyspathResourceTest,
+        SyspathUnicodeTest,
+        SysEncodingTest,
+        SysArgvTest
+    )
 
 if __name__ == "__main__":
     test_main()
diff --git a/src/org/python/core/PySystemState.java b/src/org/python/core/PySystemState.java
--- a/src/org/python/core/PySystemState.java
+++ b/src/org/python/core/PySystemState.java
@@ -1130,7 +1130,7 @@
         PyList argv = new PyList();
         if (args != null) {
             for (String arg : args) {
-                argv.append(new PyString(arg));
+                argv.append(Py.newStringOrUnicode(arg));
             }
         }
         return argv;

-- 
Repository URL: https://hg.python.org/jython


More information about the Jython-checkins mailing list