JDK-4947220 : (process) Runtime.exec() cannot invoke applications with unicode parameters (win)
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang
  • Affected Version: 6,6u21,6-pool,7
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS:
    generic,windows_2000,windows_2003,windows_xp generic,windows_2000,windows_2003,windows_xp
  • CPU: generic,x86
  • Submitted: 2003-10-31
  • Updated: 2011-05-05
  • Resolved: 2011-03-08
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6 JDK 7
6u27-revFixed 7 b89Fixed
Related Reports
Duplicate :  
Description
Name: gm110360			Date: 10/31/2003


FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)

FULL OS VERSION :
Microsoft Windows 2000 [Version 5.00.2195]

A DESCRIPTION OF THE PROBLEM :
I'm trying to invoke a C++ executable from java using the Runtime.exec() method. The C++ application accepts a filename as a command line argument & opens the file. This C++ app is unicode enabled i.e. it can accept UTF-16 (wide char) parameters. However, when i invoke this application using Java's Runtime.exec() and specify a japanese file name as an argument, the japanese characters get converted to '?' characters by the time they are received in the C++ application. I'm running this application on Windows 2K, default i.e. English version.

Looking at the source code of Runtime class, it seems that the exec()
function makes use of a native helper function - execInternal(). This function seems to be converting the parameters from UTF-16 to the system encoding.

I'm more surprised because the VC++ counterpart of this function i.e. CreateProcessW() does work in this case i.e. it is able to invoke an external application with unicode parameters (say with japanese arguments on an English Windows).

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Runtime.exec() should be able to invoke external applications with Unicode arguments i.e. the user should be able to pass japanese arguments on an English Windows.

REPRODUCIBILITY :
This bug can be reproduced always.
(Incident Review ID: 207056) 
======================================================================

Comments
CONVERTED DATA BugTraq+ Release Management Values COMMIT TO FIX: mustang
2004-09-07

EVALUATION Java is a pure Unicode system, and so is Windows, if one consistently uses the "W" operating system functions at the C level. Java should move to doing things this way. Currently a mixture of the W and A functions are being used. This is too risky and too large a change for Tiger. Hopefully we can finish the job in Mustang. ###@###.### 2003-10-31
2003-10-31