При перекодировании текста с кириллицей из кодировки WIN1251 в UTF-8 буква И становится нечитаемой последовательностью символов, которая начинается ромбиком со знаком вопроса. Это проблема не джавы, насколько я понимаю, а именно совместимости кодировок. Т.к. остальные кириллические символы перекодируются нормально. Далее будет показан workaround.
Решение заключается в том, что в исходной строке в кодировке WIN-1251 надо заменить большую букву «И» на маркер __MARKER_I__, который не исказится при перекодировании и при этом не встречается в тексте сам по себе. Это важно из-за того, что маркер после перекодирования будет заменен на И, если бы он встречался в исходном тексте, то будут незапланированные замены. Иными словами, во время перекодирования в строке просто не будет буквы И. Код:
String ENCODING_TO_BE_APPLIED = "windows-1251"; String MARKER = "__MARKER_I__"; try { String CYRILLIC_I = new String("И".getBytes("UTF-8"), ENCODING_TO_BE_APPLIED); content = content.replace(CYRILLIC_I, MARKER); content = new String(content.getBytes(ENCODING_TO_BE_APPLIED), "UTF-8"); content = content.replace(MARKER, "И"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } |