diff --git a/spring-core/src/main/java/org/springframework/util/StringUtils.java b/spring-core/src/main/java/org/springframework/util/StringUtils.java index 2f14858af24cfbaeb1c86314809588cdf7b41daa..1d2734c889260de86bb5054f4b8e0f777d2e8935 100644 --- a/spring-core/src/main/java/org/springframework/util/StringUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StringUtils.java @@ -715,7 +715,7 @@ public abstract class StringUtils { private static void validateLocalePart(String localePart) { for (int i = 0; i < localePart.length(); i++) { char ch = localePart.charAt(i); - if (ch != '_' && ch != ' ' && !Character.isLetterOrDigit(ch)) { + if (ch != ' ' && ch != '_' && ch != '#' && !Character.isLetterOrDigit(ch)) { throw new IllegalArgumentException( "Locale part \"" + localePart + "\" contains invalid characters"); } diff --git a/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java b/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java index e63ec35575c14b9f106b4c232f0c195f4c7de193..21cc7374963e812585e0d103e4529f3c8760db02 100644 --- a/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/util/StringUtilsTests.java @@ -692,4 +692,9 @@ public class StringUtilsTests { assertEquals("Variant containing country code not extracted correctly", variant, locale.getVariant()); } + @Test // SPR-14718 + public void testParseJava7Variant() { + assertEquals("sr_#LATN", StringUtils.parseLocaleString("sr_#LATN").toString()); + } + }