The page loads through the proxy, but accented letters come back mangled. Before changing proxies, find the first place the response bytes become a Java String. An InputStreamReader without an explicit charset can make that decision before jsoup sees the document.

When jsoup handles the fetch, keep the response together until parsing:

Connection.Response response = Jsoup
    .connect("https://www.example.com/catalog")
    .proxy("proxy.example", 8080)
    .execute();
Document page = response.parse();

The response API exposes charset information derived from Content-Type. It can also accept an explicit charset override when you have established that the server's declaration is wrong. A proxy address by itself does not tell you which character encoding the document uses. If you need a permitted public-page comparison with no proxy account, replace the example’s HTTP host and port with a candidate from the HTTP proxy list, while keeping the same encoding checks.

If another HTTP client supplies an InputStream, jsoup's stream parse overload accepts a charset name and a base URI. A null charset allows its documented detection and fallback behavior; a known, correct HTTP charset should be carried across deliberately. The base URI supplies context for relative links.

Once bytes have been decoded incorrectly, parsing the resulting String with another charset does not recover the original text. Go back to the bytes and the response metadata. Also compare what was received: a proxy's login page or denial may be a completely different document from the requested page, rather than a decoding failure in it.

Ũhoro ũhĩtĩte