From 91cb8bf24ecdaaf6337a57bf57c9fa34844e0179 Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Thu, 9 Feb 2017 23:09:08 +0000 Subject: [PATCH] ICU-12410 bug fixes X-SVN-Rev: 39657 --- icu4c/source/common/ustrcase.cpp | 30 ++++++++++++------- .../src/com/ibm/icu/impl/CaseMapImpl.java | 27 +++++++++++------ .../core/src/com/ibm/icu/lang/UCharacter.java | 11 ++++--- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/icu4c/source/common/ustrcase.cpp b/icu4c/source/common/ustrcase.cpp index 31522047870..6661bdc497a 100644 --- a/icu4c/source/common/ustrcase.cpp +++ b/icu4c/source/common/ustrcase.cpp @@ -322,17 +322,27 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it /* Special case Dutch IJ titlecasing */ if (titleStart+1 < index && caseLocale == UCASE_LOC_DUTCH && - (src[titleStart] == 0x0049 || src[titleStart] == 0x0069) && - src[titleStart+1] == 0x006A) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - if(edits!=NULL) { - edits->addReplace(1, 1); + (src[titleStart] == 0x0049 || src[titleStart] == 0x0069)) { + if (src[titleStart+1] == 0x006A) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + if(edits!=NULL) { + edits->addReplace(1, 1); + } + titleLimit++; + } else if (src[titleStart+1] == 0x004A) { + // Keep the capital J from getting lowercased. + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+titleStart+1, 1, options, edits); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + titleLimit++; } - titleLimit++; } /* lowercase [titleLimit..index[ */ diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java index c8cfadb5baf..f28e60ed5ea 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java @@ -303,16 +303,25 @@ public final class CaseMapImpl { // Special case Dutch IJ titlecasing if (titleStart+1 < index && caseLocale == UCaseProps.LOC_DUTCH) { char c1 = src.charAt(titleStart); - char c2 = src.charAt(titleStart+1); - if ((c1 == 'i' || c1 == 'I') && c2 == 'j') { - dest.append('J'); - if (edits != null) { - edits.addReplace(1, 1); + if ((c1 == 'i' || c1 == 'I')) { + char c2 = src.charAt(titleStart+1); + if (c2 == 'j') { + dest.append('J'); + if (edits != null) { + edits.addReplace(1, 1); + } + c = iter.nextCaseMapCP(); + titleLimit++; + assert c == c2; + assert titleLimit == iter.getCPLimit(); + } else if (c2 == 'J') { + // Keep the capital J from getting lowercased. + appendUnchanged(src, titleStart + 1, 1, dest, options, edits); + c = iter.nextCaseMapCP(); + titleLimit++; + assert c == c2; + assert titleLimit == iter.getCPLimit(); } - c=iter.nextCaseMapCP(); - titleLimit++; - assert c == c2; - assert titleLimit == iter.getCPLimit(); } } diff --git a/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java b/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java index 7b2af3061c8..65cebb36a92 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java @@ -4974,11 +4974,11 @@ public final class UCharacter implements ECharacterCategory, ECharacterDirection // Good if no or few changes. Bad (slow) if many changes. Edits edits = new Edits(); StringBuilder replacementChars = CaseMapImpl.toTitle( - caseLocale, CaseMapImpl.OMIT_UNCHANGED_TEXT, titleIter, str, + caseLocale, options | CaseMapImpl.OMIT_UNCHANGED_TEXT, titleIter, str, new StringBuilder(), edits); return applyEdits(str, replacementChars, edits); } else { - return CaseMapImpl.toTitle(caseLocale, 0, titleIter, str, + return CaseMapImpl.toTitle(caseLocale, options, titleIter, str, new StringBuilder(str.length()), null).toString(); } } @@ -5124,6 +5124,9 @@ public final class UCharacter implements ECharacterCategory, ECharacterDirection public static String toTitleCase(ULocale locale, String str, BreakIterator titleIter, int options) { if(titleIter == null) { + if (locale == null) { + locale = ULocale.getDefault(); + } titleIter = BreakIterator.getWordInstance(locale); } titleIter.setText(str); @@ -5359,10 +5362,10 @@ public final class UCharacter implements ECharacterCategory, ECharacterDirection // Good if no or few changes. Bad (slow) if many changes. Edits edits = new Edits(); StringBuilder replacementChars = CaseMapImpl.fold( - CaseMapImpl.OMIT_UNCHANGED_TEXT, str, new StringBuilder(), edits); + options | CaseMapImpl.OMIT_UNCHANGED_TEXT, str, new StringBuilder(), edits); return applyEdits(str, replacementChars, edits); } else { - return CaseMapImpl.fold(0, str, new StringBuilder(str.length()), null).toString(); + return CaseMapImpl.fold(options, str, new StringBuilder(str.length()), null).toString(); } } -- 2.40.0