From 4756d60d89aa8424e72d0c3cfd450095e63bc4eb Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Thu, 16 Apr 2026 14:41:36 -0700 Subject: [PATCH 1/3] initial commit --- .../tools/cldrconverter/BundleGenerator.java | 4 +- .../tools/cldrconverter/CLDRConverter.java | 41 +++------ .../ResourceBundleGenerator.java | 88 +++++++------------ make/modules/java.base/Gensrc.gmk | 7 +- make/modules/jdk.localedata/Gensrc.gmk | 5 +- 5 files changed, 51 insertions(+), 94 deletions(-) diff --git a/make/jdk/src/classes/build/tools/cldrconverter/BundleGenerator.java b/make/jdk/src/classes/build/tools/cldrconverter/BundleGenerator.java index 20e259a0ba755..be5e49f8f7d40 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/BundleGenerator.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/BundleGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2026, 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 @@ -50,7 +50,7 @@ String getClassName() { }; public void generateBundle(String packageName, String baseName, String localeID, - boolean useJava, Map map, BundleType type) throws IOException; + Map map, BundleType type) throws IOException; public void generateMetaInfo(Map> metaInfo) throws IOException; } diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java index 9f42326ef0953..edfac8fd1debd 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java @@ -183,7 +183,6 @@ String getKeyword() { } } - static boolean USE_UTF8 = false; private static boolean verbose; private CLDRConverter() { @@ -232,10 +231,6 @@ public static void main(String[] args) throws Exception { DESTINATION_DIR = args[++i]; break; - case "-utf8": - USE_UTF8 = true; - break; - case "-verbose": verbose = true; break; @@ -336,7 +331,6 @@ private static void usage() { + "\t-year year copyright year in output%n" + "\t-zntempfile template file for java.time.format.ZoneName.java%n" + "\t-tzdatadir tzdata directory for java.time.format.ZoneName.java%n" - + "\t-utf8 use UTF-8 rather than \\uxxxx (for debug)%n" + "\t-jdk-header-template %n" + "\t\t override default GPL header with contents of file%n"); } @@ -612,31 +606,31 @@ private static void convertBundles(List bundles) throws Exception { if (bundleTypes.contains(Bundle.Type.LOCALENAMES)) { Map localeNamesMap = extractLocaleNames(targetMap, id); if (!localeNamesMap.isEmpty() || bundle.isRoot()) { - bundleGenerator.generateBundle("util", "LocaleNames", id, true, localeNamesMap, BundleType.OPEN); + bundleGenerator.generateBundle("util", "LocaleNames", id, localeNamesMap, BundleType.OPEN); } } if (bundleTypes.contains(Bundle.Type.CURRENCYNAMES)) { Map currencyNamesMap = extractCurrencyNames(targetMap, id, bundle.getCurrencies()); if (!currencyNamesMap.isEmpty() || bundle.isRoot()) { - bundleGenerator.generateBundle("util", "CurrencyNames", id, true, currencyNamesMap, BundleType.OPEN); + bundleGenerator.generateBundle("util", "CurrencyNames", id, currencyNamesMap, BundleType.OPEN); } } if (bundleTypes.contains(Bundle.Type.TIMEZONENAMES)) { Map zoneNamesMap = extractZoneNames(targetMap, id); if (!zoneNamesMap.isEmpty() || bundle.isRoot()) { - bundleGenerator.generateBundle("util", "TimeZoneNames", id, true, zoneNamesMap, BundleType.TIMEZONE); + bundleGenerator.generateBundle("util", "TimeZoneNames", id, zoneNamesMap, BundleType.TIMEZONE); } } if (bundleTypes.contains(Bundle.Type.CALENDARDATA)) { Map calendarDataMap = extractCalendarData(targetMap, id); if (!calendarDataMap.isEmpty() || bundle.isRoot()) { - bundleGenerator.generateBundle("util", "CalendarData", id, true, calendarDataMap, BundleType.PLAIN); + bundleGenerator.generateBundle("util", "CalendarData", id, calendarDataMap, BundleType.PLAIN); } } if (bundleTypes.contains(Bundle.Type.FORMATDATA)) { Map formatDataMap = extractFormatData(targetMap, id); if (!formatDataMap.isEmpty() || bundle.isRoot()) { - bundleGenerator.generateBundle("text", "FormatData", id, true, formatDataMap, BundleType.PLAIN); + bundleGenerator.generateBundle("text", "FormatData", id, formatDataMap, BundleType.PLAIN); } } @@ -1053,28 +1047,15 @@ private static void copyIfPresent(Map src, String key, Map 0x007e)) { + if (aChar < 0x0020) { formatter.format("\\u%04x", (int)aChar); } else { - if (specialSaveChars.indexOf(aChar) != -1) { + if (aChar == 0x0022) { outBuffer.append('\\'); } outBuffer.append(aChar); diff --git a/make/jdk/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java b/make/jdk/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java index 8278bf6bcfa0c..0bc5a2bdb0dff 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java @@ -70,9 +70,8 @@ class ResourceBundleGenerator implements BundleGenerator { private static final String META_VALUE_PREFIX = "metaValue_"; @Override - public void generateBundle(String packageName, String baseName, String localeID, boolean useJava, + public void generateBundle(String packageName, String baseName, String localeID, Map map, BundleType type) throws IOException { - String suffix = useJava ? ".java" : ".properties"; String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator + packageName + File.separator + "resources" + File.separator + "cldr"; packageName = packageName + ".resources.cldr"; @@ -91,23 +90,12 @@ public void generateBundle(String packageName, String baseName, String localeID, if (!dir.exists()) { dir.mkdirs(); } - File file = new File(dir, baseName + ("root".equals(localeID) ? "" : "_" + localeID) + suffix); + File file = new File(dir, baseName + ("root".equals(localeID) ? "" : "_" + localeID) + ".java"); if (!file.exists()) { file.createNewFile(); } CLDRConverter.info("\tWriting file " + file); - String encoding; - if (useJava) { - if (CLDRConverter.USE_UTF8) { - encoding = "utf-8"; - } else { - encoding = "us-ascii"; - } - } else { - encoding = "iso-8859-1"; - } - Formatter fmt = null; if (type == BundleType.TIMEZONE) { fmt = new Formatter(); @@ -119,7 +107,7 @@ public void generateBundle(String packageName, String baseName, String localeID, value = (String[]) map.get(key); fmt.format(" final String[] %s = new String[] {\n", meta); for (String s : value) { - fmt.format(" \"%s\",\n", CLDRConverter.saveConvert(s, useJava)); + fmt.format(" \"%s\",\n", CLDRConverter.escape(s)); } fmt.format(" };\n"); metaKeys.add(key); @@ -159,11 +147,11 @@ public void generateBundle(String packageName, String baseName, String localeID, if (val instanceof String[] values) { fmt.format(" final String[] %s = new String[] {\n", metaVal); for (String s : values) { - fmt.format(" \"%s\",\n", CLDRConverter.saveConvert(s, useJava)); + fmt.format(" \"%s\",\n", CLDRConverter.escape(s)); } fmt.format(" };\n"); } else { - fmt.format(" final String %s = \"%s\";\n", metaVal, CLDRConverter.saveConvert((String)val, useJava)); + fmt.format(" final String %s = \"%s\";\n", metaVal, CLDRConverter.escape((String)val)); } newMap.put(oldEntry.key, oldEntry.metaKey()); } @@ -173,55 +161,47 @@ public void generateBundle(String packageName, String baseName, String localeID, map = newMap; } - try (PrintWriter out = new PrintWriter(file, encoding)) { + try (PrintWriter out = new PrintWriter(file, "utf-8")) { // Output copyright headers out.println(getOpenJDKCopyright()); out.println(CopyrightHeaders.getUnicodeCopyright()); - if (useJava) { - out.println("package sun." + packageName + ";\n"); - out.printf("import %s;\n\n", type.getPathName()); - out.printf("public class %s%s extends %s {\n", baseName, "root".equals(localeID) ? "" : "_" + localeID, type.getClassName()); + out.println("package sun." + packageName + ";\n"); + out.printf("import %s;\n\n", type.getPathName()); + out.printf("public class %s%s extends %s {\n", baseName, "root".equals(localeID) ? "" : "_" + localeID, type.getClassName()); - out.println(" @Override\n" + - " protected final Object[][] getContents() {"); - if (fmt != null) { - out.print(fmt.toString()); - } - out.println(" final Object[][] data = new Object[][] {"); + out.println(" @Override\n" + + " protected final Object[][] getContents() {"); + if (fmt != null) { + out.print(fmt.toString()); } + out.println(" final Object[][] data = new Object[][] {"); for (String key : map.keySet()) { - if (useJava) { - Object value = map.get(key); - if (value == null) { - CLDRConverter.warning("null value for " + key); - } else if (value instanceof String) { - String valStr = (String)value; - if (type == BundleType.TIMEZONE && - !(key.startsWith(CLDRConverter.EXEMPLAR_CITY_PREFIX) || - key.startsWith(CLDRConverter.METAZONE_DSTOFFSET_PREFIX)) || - valStr.startsWith(META_VALUE_PREFIX)) { - out.printf(" { \"%s\", %s },\n", key, CLDRConverter.saveConvert(valStr, useJava)); - } else { - out.printf(" { \"%s\", \"%s\" },\n", key, CLDRConverter.saveConvert(valStr, useJava)); - } - } else if (value instanceof String[]) { - String[] values = (String[]) value; - out.println(" { \"" + key + "\",\n new String[] {"); - for (String s : values) { - out.println(" \"" + CLDRConverter.saveConvert(s, useJava) + "\","); - } - out.println(" }\n },"); + Object value = map.get(key); + if (value == null) { + CLDRConverter.warning("null value for " + key); + } else if (value instanceof String) { + String valStr = (String)value; + if (type == BundleType.TIMEZONE && + !(key.startsWith(CLDRConverter.EXEMPLAR_CITY_PREFIX) || + key.startsWith(CLDRConverter.METAZONE_DSTOFFSET_PREFIX)) || + valStr.startsWith(META_VALUE_PREFIX)) { + out.printf(" { \"%s\", %s },\n", key, CLDRConverter.escape(valStr)); } else { - throw new RuntimeException("unknown value type: " + value.getClass().getName()); + out.printf(" { \"%s\", \"%s\" },\n", key, CLDRConverter.escape(valStr)); } + } else if (value instanceof String[]) { + String[] values = (String[]) value; + out.println(" { \"" + key + "\",\n new String[] {"); + for (String s : values) { + out.println(" \"" + CLDRConverter.escape(s) + "\","); + } + out.println(" }\n },"); } else { - out.println(key + "=" + CLDRConverter.saveConvert((String) map.get(key), useJava)); + throw new RuntimeException("unknown value type: " + value.getClass().getName()); } } - if (useJava) { - out.println(" };\n return data;\n }\n}"); - } + out.println(" };\n return data;\n }\n}"); } } diff --git a/make/modules/java.base/Gensrc.gmk b/make/modules/java.base/Gensrc.gmk index e8236f0b0e498..675038c8fd573 100644 --- a/make/modules/java.base/Gensrc.gmk +++ b/make/modules/java.base/Gensrc.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2026, 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 @@ -47,8 +47,6 @@ CLDR_GEN_DONE := $(GENSRC_DIR)/_cldr-gensrc.marker TZ_DATA_DIR := $(MODULE_SRC)/share/data/tzdata ZONENAME_TEMPLATE := $(MODULE_SRC)/share/classes/java/time/format/ZoneName.java.template -# The `-utf8` option is used even for US English, as some names -# may contain non-ASCII characters, such as “Türkiye”. $(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \ $(wildcard $(CLDR_DATA_DIR)/main/en*.xml) \ $(wildcard $(CLDR_DATA_DIR)/supplemental/*.xml) \ @@ -64,8 +62,7 @@ $(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \ -basemodule \ -year $(COPYRIGHT_YEAR) \ -zntempfile $(ZONENAME_TEMPLATE) \ - -tzdatadir $(TZ_DATA_DIR) \ - -utf8) + -tzdatadir $(TZ_DATA_DIR)) $(TOUCH) $@ TARGETS += $(CLDR_GEN_DONE) diff --git a/make/modules/jdk.localedata/Gensrc.gmk b/make/modules/jdk.localedata/Gensrc.gmk index 93b863df66f76..2ff972c7536c3 100644 --- a/make/modules/jdk.localedata/Gensrc.gmk +++ b/make/modules/jdk.localedata/Gensrc.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2026, 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 @@ -45,8 +45,7 @@ $(CLDR_GEN_DONE): $(wildcard $(CLDR_DATA_DIR)/dtd/*.dtd) \ -baselocales "en-US" \ -year $(COPYRIGHT_YEAR) \ -o $(GENSRC_DIR) \ - -tzdatadir $(TZ_DATA_DIR) \ - -utf8) + -tzdatadir $(TZ_DATA_DIR)) $(TOUCH) $@ TARGETS += $(CLDR_GEN_DONE) From 2816f2f6d4bd113d414f910188a3070d8fca217b Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Mon, 20 Apr 2026 09:33:12 -0700 Subject: [PATCH 2/3] Refined comments for ASCII quotation marks --- .../src/classes/build/tools/cldrconverter/CLDRConverter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java index edfac8fd1debd..4f281307bf6de 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java @@ -1049,7 +1049,7 @@ private static void copyIfPresent(Map src, String key, Map Date: Wed, 22 Apr 2026 09:50:37 -0700 Subject: [PATCH 3/3] Addressing review comments --- .../classes/build/tools/cldrconverter/CLDRConverter.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java index 4f281307bf6de..18ce0c334fb8c 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java @@ -1069,9 +1069,9 @@ static String escape(String theString) { } outBuffer.append(' '); break; - case '\\': - outBuffer.append('\\'); + case '\\', '"': outBuffer.append('\\'); + outBuffer.append(aChar); break; case '\t': outBuffer.append('\\'); @@ -1093,10 +1093,6 @@ static String escape(String theString) { if (aChar < 0x0020) { formatter.format("\\u%04x", (int)aChar); } else { - if (aChar == 0x0022) { - // Escape ASCII quotation marks - outBuffer.append('\\'); - } outBuffer.append(aChar); } }