From 51fc0d5a4b66e366b0bbd15ee9a8ca157287ca11 Mon Sep 17 00:00:00 2001 From: Ben Waters Date: Mon, 26 Jun 2023 17:31:09 -0400 Subject: [PATCH 1/3] CODEC-308: change NYSIIS encoding to not remove the first character if its an A or S --- .../java/org/apache/commons/codec/language/Nysiis.java | 9 ++++++++- .../org/apache/commons/codec/language/NysiisTest.java | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/codec/language/Nysiis.java b/src/main/java/org/apache/commons/codec/language/Nysiis.java index efcc13f6ad..55f7c7da91 100644 --- a/src/main/java/org/apache/commons/codec/language/Nysiis.java +++ b/src/main/java/org/apache/commons/codec/language/Nysiis.java @@ -267,7 +267,8 @@ public String nysiis(String str) { // First character of key = first character of name. final StringBuilder key = new StringBuilder(str.length()); - key.append(str.charAt(0)); + final char firstChar = str.charAt(0); + key.append(firstChar); // Transcode remaining characters, incrementing by one character each time final char[] chars = str.toCharArray(); @@ -306,6 +307,12 @@ public String nysiis(String str) { if (lastChar == 'A') { key.deleteCharAt(key.length() - 1); } + + if(key.length()==0){ + // We've removed the first character of the string. Likely because it was an S or A + // We should return at least the first character + key.append(firstChar); + } } final String string = key.toString(); diff --git a/src/test/java/org/apache/commons/codec/language/NysiisTest.java b/src/test/java/org/apache/commons/codec/language/NysiisTest.java index 5e594eacd6..80b3b4efd3 100644 --- a/src/test/java/org/apache/commons/codec/language/NysiisTest.java +++ b/src/test/java/org/apache/commons/codec/language/NysiisTest.java @@ -136,7 +136,8 @@ void testDropBy() { new String[] { "JILES", "JAL" }, // violates 6: if the last two characters are AY, remove A new String[] { "CARRAWAY", "CARY" }, // Original: CARAY - new String[] { "YAMADA", "YANAD" }); + new String[] { "YAMADA", "YANAD" }, + new String[] { "ASH", "A"}); } @Test From 46b6a60a3d68525de7b3bb6e00eedf158d17acf2 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Mon, 26 Jun 2023 18:18:43 -0400 Subject: [PATCH 2/3] Fix formatting --- src/main/java/org/apache/commons/codec/language/Nysiis.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/codec/language/Nysiis.java b/src/main/java/org/apache/commons/codec/language/Nysiis.java index 55f7c7da91..18baa5b19a 100644 --- a/src/main/java/org/apache/commons/codec/language/Nysiis.java +++ b/src/main/java/org/apache/commons/codec/language/Nysiis.java @@ -308,7 +308,7 @@ public String nysiis(String str) { key.deleteCharAt(key.length() - 1); } - if(key.length()==0){ + if (key.length() == 0) { // We've removed the first character of the string. Likely because it was an S or A // We should return at least the first character key.append(firstChar); From 2cef7901851895712679d58c8d6237491050b2ac Mon Sep 17 00:00:00 2001 From: Ben Waters Date: Mon, 7 Sep 2026 17:21:14 -0400 Subject: [PATCH 3/3] CODEC-308 : add test case for trailing S to avoid empty string --- .../org/apache/commons/codec/language/NysiisTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/apache/commons/codec/language/NysiisTest.java b/src/test/java/org/apache/commons/codec/language/NysiisTest.java index 80b3b4efd3..475513acd9 100644 --- a/src/test/java/org/apache/commons/codec/language/NysiisTest.java +++ b/src/test/java/org/apache/commons/codec/language/NysiisTest.java @@ -17,12 +17,12 @@ package org.apache.commons.codec.language; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - import org.apache.commons.codec.AbstractStringEncoderTest; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * Tests {@link Nysiis} */ @@ -137,7 +137,8 @@ void testDropBy() { // violates 6: if the last two characters are AY, remove A new String[] { "CARRAWAY", "CARY" }, // Original: CARAY new String[] { "YAMADA", "YANAD" }, - new String[] { "ASH", "A"}); + new String[] { "ASH", "A"}, + new String[] { "SSH", "S"}); } @Test