Ваш вставленный код не содержит ошибок и должен делать именно то, что вы хотите.
Тем не менее, это почти 100%, безусловно, должно быть проблемой кодировки символов.
Все символы вВаша действительная строка, за исключением символа фунта, находится в диапазоне ASCII 32-127, и почти во всех существующих кодировках символов это просто работает (строка "foo", если она закодирована в байтах с использованием ASCII итогда декодирование с помощью UTF-8, или ISO-8859-1, или Win CP252, или просто чего-то еще, все еще "foo") - но этот фунт - нет. Если вы возьмете строку «Это будет 5 фунтов стерлингов - пожалуйста!», Закодируйте ее в байтах, скажем, ISO-8859-1, а затем декодируйте ее обратно в строку, используя UTF-8, вы получите »Это будет 5, - пожалуйста! ".
Итак, на минуту теоретизируем, что эта строка кодируется с использованием одной кодировки кодировки, а затем декодируется с использованием другой, это ваша ошибка, но эта ошибка победила. Это не имеет никакого эффекта, пока все символы, которые вы выбрасываете в этом ошибочном процессе, находятся в диапазоне 32-127 в таблице ASCII.
Таким образом, у вас есть 2 способа решения этой проблемы. Это исправит любой из них:
Убедитесь, что список допустимых символов содержит только 32-127 символов ASCII. Например, удалите фунт, сделайте его минусом, подчеркиванием или открытыми скобками.
Найдите место, в котором вы кодируете строки в байты и наоборот, и убедитесь, чтоВы всегда явно говорите, какую кодировку вы используете. Тогда я настоятельно рекомендую вам явно применить UTF-8. Например:
ПЛОХО:
new FileReader(new File("/path/to/a/file"))
byte[] bytes = .... some bytes ...; String x = new String(bytes);
ХОРОШО:
Files.newBufferedReader(Paths.get("/path/to/a/file")) // case 1
new BufferedReader(new InputStreamReader(new FileInputStream(new File("/path/to/a/file")), StandardCharsets.UTF_8)); // case 2
byte[] bytes = .... some bytes ...; String x = new String(bytes, StandardCharsets.UTF_8);
Хотя обратите внимание, конечно, во всех этих случаях вы должны использовать try-with-resources для их правильного закрытия.
Случай 1 хорош, потому что API Файлов, в отличие от большинства других мест в библиотеках ядра Java, определен как всегда с UTF-8 как кодировка (тогда как другие местаиспользуйте «стандартное значение платформы», что бы это ни было, обычно это плохой выбор), и варианты 2 и 3 хороши, потому что вы явно используете UTF-8.