?
является результатом проблем с кодировкой набора символов и может возникать во многих местах в конвейере данных.
Это может быть при печати строки, а сама строка является допустимой.
Чтобы узнать, каково действительное значение символа, попробуйте запустить этот код, чтобы напечатать escape-код Unicode для всех символов, не входящих в ASCII, найденных в строке:
public static void printNonAscii(String s) {
TreeSet<Character> nonAscii = new TreeSet<>();
for (char ch : s.replaceAll("[\r\n\\x20-\\x7E]", "").toCharArray())
nonAscii.add(ch);
for (char ch : nonAscii)
System.out.printf("\\u%04X %s%n", (int) ch, ch);
}
Test(источник в UTF-8)
printNonAscii("Foo ? \uFFFD ç ñ © ¼");
Выход
\u00A9 ©
\u00BC ¼
\u00E7 ç
\u00F1 ñ
\uFFFD �