Пример

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 не поддерживает символы из дополнительного диапазона Unicode."); //$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("Символ 'A' не должен совпадать с 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 не поддерживает сравнение с учётом локали.");
}else {
System.out.println("OK!");
}
}
Решение
Используйте ICU 2.6.1com.ibm.icu.text.StringSearch, обратитесь к документации по классу StringSearch

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$
}