diff --git a/src/main/java/org/apache/commons/codec/language/DoubleMetaphone.java b/src/main/java/org/apache/commons/codec/language/DoubleMetaphone.java index 3013c93451..59f4e3e675 100644 --- a/src/main/java/org/apache/commons/codec/language/DoubleMetaphone.java +++ b/src/main/java/org/apache/commons/codec/language/DoubleMetaphone.java @@ -132,8 +132,7 @@ public String doubleMetaphone(String value, final boolean alternate) { index = handleJ(value, result, index, slavoGermanic); break; case 'K': - result.append('K'); - index = charAt(value, index + 1) == 'K' ? index + 2 : index + 1; + index = handleK(value, result, index); break; case 'L': index = handleL(value, result, index); @@ -543,6 +542,25 @@ private int handleJ(final String value, final DoubleMetaphoneResult result, int return index; } + /** + * Handles 'K' cases. + */ + private int handleK(final String value, final DoubleMetaphoneResult result, int index) { + result.append('K'); + if (charAt(value, index + 1) == 'K') { + index += 2; + } else if ((charAt(value, index + 1) == 'C')) { //-- in "Kirkcaldy", "kc" should be encoded "K" instead of "KK" --// + final DoubleMetaphoneResult nextCharResult = new DoubleMetaphoneResult(this.getMaxCodeLen()); + int nextCharIndex = handleC(value, nextCharResult, index + 1); + if (nextCharResult.getPrimary().equals("K")) { + index = nextCharIndex; + } + } else { + index++; + } + return index; + } + /** * Handles 'L' cases. */ diff --git a/src/test/java/org/apache/commons/codec/language/DoubleMetaphone2Test.java b/src/test/java/org/apache/commons/codec/language/DoubleMetaphone2Test.java index d088ec51f9..aba6e5f410 100644 --- a/src/test/java/org/apache/commons/codec/language/DoubleMetaphone2Test.java +++ b/src/test/java/org/apache/commons/codec/language/DoubleMetaphone2Test.java @@ -512,6 +512,7 @@ public class DoubleMetaphone2Test extends StringEncoderAbstractTest