8011194: Apps launched via double-clicked .jars have file.encoding value of US-ASCII on Mac OS X
Summary: On Mac, default to UTF-8 if no environmental hints are available
Reviewed-by: naoto, ddehaven
--- a/jdk/src/solaris/native/java/lang/java_props_md.c Wed Jul 31 10:53:33 2013 -0700
+++ b/jdk/src/solaris/native/java/lang/java_props_md.c Fri Aug 02 15:30:11 2013 -0700
@@ -361,6 +361,25 @@
*std_encoding = "Big5-HKSCS-2001";
}
#endif
+#ifdef MACOSX
+ /*
+ * For the case on MacOS X where encoding is set to US-ASCII, but we
+ * don't have any encoding hints from LANG/LC_ALL/LC_CTYPE, use UTF-8
+ * instead.
+ *
+ * The contents of ASCII files will still be read and displayed
+ * correctly, but so will files containing UTF-8 characters beyond the
+ * standard ASCII range.
+ *
+ * Specifically, this allows apps launched by double-clicking a .jar
+ * file to correctly read UTF-8 files using the default encoding (see
+ * 8011194).
+ */
+ if (strcmp(p,"US-ASCII") == 0 && getenv("LANG") == NULL &&
+ getenv("LC_ALL") == NULL && getenv("LC_CTYPE") == NULL) {
+ *std_encoding = "UTF-8";
+ }
+#endif
}
free(temp);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/MacEncoding/ExpectedEncoding.java Fri Aug 02 15:30:11 2013 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Check that the value of file.encoding and sun.jnu.encoding match the expected
+ * values passed in on the command-line.
+ */
+public class ExpectedEncoding {
+ public static void main(String[] args) {
+ boolean failed = false;
+ if (args.length != 2) {
+ System.out.println("Usage:");
+ System.out.println("$ java ExpectedEncoding <expected file.encoding> <expected sun.jnu.encoding>");
+ System.out.println("$ use \"skip\" to skip checking property's value");
+ System.exit(1);
+ }
+ String expectFileEnc = args[0];
+ String expectSunJnuEnc = args[1];
+
+ String fileEnc = System.getProperty("file.encoding");
+ String jnuEnc = System.getProperty("sun.jnu.encoding");
+
+ if ("skip".equals(expectFileEnc)) {
+ System.err.println("Expected file.encoding is \"skip\", ignoring");
+ } else {
+ System.err.println("Expected file.encoding: " + expectFileEnc);
+ System.err.println("Actual file.encoding: " + fileEnc);
+ if (fileEnc == null || !fileEnc.equals(expectFileEnc)) {
+ failed = true;
+ }
+ }
+ if ("skip".equals(expectSunJnuEnc)) {
+ System.err.println("Expected sun.jnu.encoding is \"skip\", ignoring");
+ } else {
+ if (jnuEnc == null || !jnuEnc.equals(expectSunJnuEnc)) {
+ System.err.println("Expected sun.jnu.encoding: " + expectSunJnuEnc);
+ System.err.println("Actual sun.jnu.encoding: " + jnuEnc);
+ failed = true;
+ }
+ }
+
+ if (failed) {
+ throw new RuntimeException("Test Failed");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/MacEncoding/MacJNUEncoding.sh Fri Aug 02 15:30:11 2013 -0700
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+
+# @test
+# @bug 8003228
+# @summary Test the value of sun.jnu.encoding on Mac
+# @author Brent Christian
+#
+# @run shell MacJNUEncoding.sh
+
+# Only run test on Mac
+OS=`uname -s`
+case "$OS" in
+ Darwin ) ;;
+ * )
+ exit 0
+ ;;
+esac
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${COMPILEJAVA}" = "" ]; then
+ COMPILEJAVA="${TESTJAVA}"
+fi
+
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAVAC="${COMPILEJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+echo "Building test classes..."
+"$JAVAC" ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d "${TESTCLASSES}" "${TESTSRC}"/ExpectedEncoding.java
+
+echo ""
+echo "Running test for C locale"
+export LANG=C
+export LC_ALL=C
+"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding US-ASCII UTF-8
+result1=$?
+
+echo ""
+echo "Running test for en_US.UTF-8 locale"
+export LANG=en_US.UTF-8
+export LC_ALL=en_US.UTF-8
+"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding UTF-8 UTF-8
+result2=$?
+
+echo ""
+echo "Cleanup"
+rm ${TESTCLASSES}/ExpectedEncoding.class
+
+if [ ${result1} -ne 0 ] ; then
+ echo "Test failed for C locale"
+ echo " LANG=\"${LANG}\""
+ echo " LC_ALL=\"${LC_ALL}\""
+ exit ${result1}
+fi
+if [ ${result2} -ne 0 ] ; then
+ echo "Test failed for en_US.UTF-8 locale"
+ echo " LANG=\"${LANG}\""
+ echo " LC_ALL=\"${LC_ALL}\""
+ exit ${result2}
+fi
+exit 0
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/MacEncoding/TestFileEncoding.java Fri Aug 02 15:30:11 2013 -0700
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.*;
+
+/*
+ * @test
+ * @bug 8011194
+ * @summary Test value of file.encoding for corresponding value of LANG, etc
+ * @library ../../../../tools/launcher/ ../
+ * @build TestHelper TestFileEncoding ExpectedEncoding
+ * @run main TestFileEncoding UTF-8
+ * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding
+ * @run main TestFileEncoding UTF-8 en_US.UTF-8
+ * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding en_US.UTF-8
+ * @run main TestFileEncoding US-ASCII C
+ * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding C
+ * @author Brent Christian
+ */
+
+/**
+ * Setup the environment and run a sub-test to check the expected value of
+ * file.encoding, based on the value(s) of encoding-related environment vars
+ * (LANG, LC_ALL, LC_CTYPE).
+ *
+ * The first argument (required) is the expected value of the
+ * file.encoding System property.
+ * The second argument (optional) is the value to set to the LANG/etc env vars.
+ */
+public class TestFileEncoding {
+ private static final String TEST_NAME = "ExpectedEncoding";
+
+ private String expectedEncoding; // Expected value for file.encoding
+ private String langVar = null; // Value to set for LANG, etc
+
+ private static Set<String> envToRm = new HashSet<>(3);
+ static {
+ // Take these vars out of the test's run environment, possibly adding
+ // our own value back in.
+ envToRm.add("LANG");
+ envToRm.add("LC_ALL");
+ envToRm.add("LC_CTYPE");
+ }
+
+ public TestFileEncoding(String expectedEncoding) {
+ this.expectedEncoding = expectedEncoding;
+ }
+
+ public TestFileEncoding(String expectedEncoding, String langVar) {
+ this.expectedEncoding = expectedEncoding;
+ this.langVar = langVar;
+ }
+
+ /*
+ * Launch ExpectedEncoding with the given parameters, check for the
+ * expected file.encoding.
+ */
+ private void run() {
+ String testClasses = System.getProperty("test.classes");
+
+ // Pick up VM opts
+ String vmOptsStr = System.getProperty("test.vm.opts");
+ System.out.println("test.vm.opts: " + vmOptsStr);
+ String[] vmOpts = new String[0];
+ if (vmOptsStr != null && !"".equals(vmOptsStr)) {
+ vmOpts = vmOptsStr.split(" ");
+ System.out.println("found vm options:");
+ for (String opt : vmOpts) {
+ System.out.println(" <" + opt + ">");
+ }
+ }
+
+ // Build java cmd
+ LinkedList<String> cmdList = new LinkedList<>();
+ cmdList.add(TestHelper.javaCmd);
+ for (String vmOpt : vmOpts) {
+ if (vmOpt != null && !vmOpt.equals("")) {
+ cmdList.add(vmOpt);
+ }
+ }
+
+ // See if the user specified a file.encoding that we should pass through
+ String userEncoding = System.getProperty("userEncoding");
+ if (userEncoding != null) {
+ cmdList.add("-Dfile.encoding="+userEncoding);
+ }
+
+ cmdList.add("-cp");
+ cmdList.add(testClasses);
+ cmdList.add(TEST_NAME);
+ cmdList.add(expectedEncoding);
+ cmdList.add("skip"); // ignore sun.jnu.encoding for this test
+
+ String cmdArray[] = new String[cmdList.size()];
+ cmdList.toArray(cmdArray);
+
+ // Run the test(s)
+ if (langVar == null) {
+ System.out.println("TestFileEncoding: Running with no envvars set");
+ TestHelper.TestResult tr = TestHelper.doExec(null, envToRm,
+ cmdArray);
+ checkResult(tr);
+ } else {
+ runWithEnvVar("LANG", cmdArray);
+ runWithEnvVar("LC_ALL", cmdArray);
+ runWithEnvVar("LC_CTYPE", cmdArray);
+ }
+ }
+
+ /*
+ * Run the test, setting the environment named by envVarName to the value
+ * in langVar.
+ */
+ private void runWithEnvVar(String envVarName, String[] cmdArray) {
+ Map<String, String> envToAdd = new HashMap<>(1);
+ TestHelper.TestResult tr = null;
+
+ System.out.println("TestFileEncoding: Running with " + envVarName + "=" + langVar);
+ envToAdd.put(envVarName, langVar);
+ tr = TestHelper.doExec(envToAdd, envToRm, cmdArray);
+ checkResult(tr);
+ }
+
+ private void checkResult(TestHelper.TestResult tr) {
+ System.out.println(tr);
+ if (!tr.isOK()) {
+ throw new RuntimeException("TEST FAILED: !tr.isOK()");
+ }
+ }
+
+ public static void main(String[] args) {
+ TestFileEncoding cfe = null;
+ if (!TestHelper.isMacOSX) {
+ System.out.println("Test is currently only for Mac OS X - pass.");
+ return;
+ }
+ if (args.length == 1) {
+ cfe = new TestFileEncoding(args[0]);
+ } else if (args.length == 2) {
+ cfe = new TestFileEncoding(args[0], args[1]);
+ } else {
+ System.out.println("Usage: TestFileEncoding <expected file.encoding>");
+ System.out.println(" TestFileEncoding <expected file.encoding> <value for LANG/etc env var>");
+ return;
+ }
+ cfe.run();
+ }
+}
--- a/jdk/test/java/lang/System/MacJNUEncoding/ExpectedEncoding.java Wed Jul 31 10:53:33 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * Check that the value of file.encoding and sun.jnu.encoding match the expected
- * values passed in on the command-line.
- */
-public class ExpectedEncoding {
- public static void main(String[] args) {
- boolean failed = false;
- if (args.length != 2) {
- System.out.println("Usage:");
- System.out.println("$ java ExpectedEncoding <expected file.encoding> <expected sun.jnu.encoding>");
- System.exit(1);
- }
- String expectFileEnc = args[0];
- String expectSunJnuEnc = args[1];
-
- String fileEnc = System.getProperty("file.encoding");
- String jnuEnc = System.getProperty("sun.jnu.encoding");
-
- if (fileEnc == null || !fileEnc.equals(expectFileEnc)) {
- System.err.println("Expected file.encoding: " + expectFileEnc);
- System.err.println("Actual file.encoding: " + fileEnc);
- failed = true;
- }
- if (jnuEnc == null || !jnuEnc.equals(expectSunJnuEnc)) {
- System.err.println("Expected sun.jnu.encoding: " + expectSunJnuEnc);
- System.err.println("Actual sun.jnu.encoding: " + jnuEnc);
- failed = true;
- }
- if (failed) {
- throw new RuntimeException("Test Failed");
- }
- }
-}
--- a/jdk/test/java/lang/System/MacJNUEncoding/MacJNUEncoding.sh Wed Jul 31 10:53:33 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-
-# @test
-# @bug 8003228
-# @summary Test the value of sun.jnu.encoding on Mac
-# @author Brent Christian
-#
-# @run shell MacJNUEncoding.sh
-
-# Only run test on Mac
-OS=`uname -s`
-case "$OS" in
- Darwin ) ;;
- * )
- exit 0
- ;;
-esac
-
-if [ "${TESTJAVA}" = "" ]
-then
- echo "TESTJAVA not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ "${COMPILEJAVA}" = "" ]; then
- COMPILEJAVA="${TESTJAVA}"
-fi
-
-
-if [ "${TESTSRC}" = "" ]
-then
- echo "TESTSRC not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ "${TESTCLASSES}" = "" ]
-then
- echo "TESTCLASSES not set. Test cannot execute. Failed."
- exit 1
-fi
-
-JAVAC="${COMPILEJAVA}"/bin/javac
-JAVA="${TESTJAVA}"/bin/java
-
-echo "Building test classes..."
-"$JAVAC" ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d "${TESTCLASSES}" "${TESTSRC}"/ExpectedEncoding.java
-
-echo ""
-echo "Running test for C locale"
-export LANG=C
-export LC_ALL=C
-"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding US-ASCII UTF-8
-result1=$?
-
-echo ""
-echo "Running test for en_US.UTF-8 locale"
-export LANG=en_US.UTF-8
-export LC_ALL=en_US.UTF-8
-"${JAVA}" ${TESTVMOPTS} -classpath "${TESTCLASSES}" ExpectedEncoding UTF-8 UTF-8
-result2=$?
-
-echo ""
-echo "Cleanup"
-rm ${TESTCLASSES}/ExpectedEncoding.class
-
-if [ ${result1} -ne 0 ] ; then
- echo "Test failed for C locale"
- echo " LANG=\"${LANG}\""
- echo " LC_ALL=\"${LC_ALL}\""
- exit ${result1}
-fi
-if [ ${result2} -ne 0 ] ; then
- echo "Test failed for en_US.UTF-8 locale"
- echo " LANG=\"${LANG}\""
- echo " LC_ALL=\"${LC_ALL}\""
- exit ${result2}
-fi
-exit 0
-