Как увеличить объем кодировки US ASCII без нарушения кода, основанного на ASCII? - PullRequest
0 голосов
/ 09 мая 2020

Я открываю файл с помощью

private String getStringFromFile(File file) {
    try {
        return Files.readString(Paths.get(file.getPath()), StandardCharsets.US_ASCII);
    }
    catch (Exception e) {
        System.out.println("Error while reading: " + file.getName());
        return "";
    }
}

, и хотя файл кажется явно совместимым с ASCII, я получаю Error while reading: fileName.

Файл выглядит следующим образом :

enter image description here

Код работает, если я вручную удалю заголовок (часть с квадратными скобками) перед его открытием (я все равно удаляю их в код позже). Есть ли способ расширить набор кодировок, не нарушая при этом код, который у меня работает только с ASCII, или это какое-то редкое исключение?

Вот файл в pgn (это можно открыть как txt).

1 Ответ

3 голосов
/ 09 мая 2020

Файл почти в формате ASCII. Проблема заключается в символе кавычки в «Кот-д'Ивуар».

Файл содержит байт 0x92. В кодовой странице Windows 1252 (западноевропейские языки) это символ Unicode U + 2019 RIGHT SINGLE QUOTATION MARK.

Проблема в том, что кодовая страница 1252 немного отличается от ISO-8859-1, который использует несопоставленную позицию для некоторых распространенных символов, таких как символ евро , а также правые и левые кавычки. И его нет в списке всегда присутствующих кодировок.

Как исправить:

  • , если ваша система поддерживает win1252 или cp1252 charset, используйте его.
  • в противном случае вы должны использовать FilterInputStream для замены символов, отличных от ascii, например, пробелом (ASCII 0x20) или из настраиваемой карты (0x92 -> 0x27, чтобы заменить ПРАВО ОДИНОЧНЫЙ ЦИТАТНЫЙ ЗНАК () с простым АПОСТРОФОМ (')). После этого InputStreamReader выдаст вам ожидаемые символы.
...