サンプル

public static void main( String[] args ) {
String str = "ABC\ud800\udc00"; //\ud800\udc00 = U+10000 //$NON-NLS-1$
int index = str.indexOf( 0x10000 );
if ( index == -1 ) {
System.out.println("String does not support supplementary character."); //$NON-NLS-1$
} else {
System.out.println("Index = " + index); //$NON-NLS-1$
}
}

public static void TestIndexOf() {
String str = "A\u0300";
int index = str.indexOf(A);
if (index == -1 ) {
System.out.println("OK!");
}else {
System.out.println("The character 'A' should not be matched in A\\u0300");
}
}
public static void TestIndexOf() {
String str = "A quick fox jumped over the lazy dog.";
int index = str.indexOf("FOX");
if (index == -1 ) {
System.out.println("IndexOf does not suppport locale-senstive matching.");
}else {
System.out.println("OK!");
}
}
解決策
ICU 2.6.1 com.ibm.icu.text.StringSearch を使用します (詳細は StringSearch Java Doc を参照してください)。

public static void main( String[] args ) {
RuleBasedCollator coll = (RuleBasedCollator)Collator.getInstance(Locale.US);
coll.setStrength(Collator.PRIMARY);
com.ibm.icu.text.StringSearch search = new com.ibm.icu.text.StringSearch("FOX", new StringCharacterIterator("A quick fox jumped over the lazy dog."), coll); //$NON-NLS-1$ //$NON-NLS-2$
int index = search.first();
System.out.println("Index = " + index); //$NON-NLS-1$
}