Как использовать ошибки декодирования символов журнала в Scala с scala .io.Codec - PullRequest
1 голос
/ 16 июня 2020

Используя Scala, я читаю файл с ожидаемой кодировкой (в данном случае UTF-8) и хочу регистрировать ошибки кодирования. Просто вставить заменяющий символ «�» можно следующим образом:

import scala.io.Source
import scala.io.Codec
import java.nio.charset.MalformedInputException
import java.nio.charset.CodingErrorAction

object Main extends App {
    val codec = Codec("UTF-8").onMalformedInput(CodingErrorAction.REPLACE)
    val s = Source.fromFile("test.txt")(codec)
    s.getLines foreach println
}

Есть еще одна функция scala.io.Codec.onCodingException, которая принимает функцию типа CharacterCodingException => Int. Однако из документации неясно, что представляет этот Int - я предполагаю, что это может быть значение Unicode, которое мы должны декодировать как недопустимый ввод. Я пробовал это:

object Main extends App {
    val codec = Codec("UTF-8").onCodingException {
        case e: MalformedInputException => {
            System.err.println(e.getMessage())
            0xFFFD
        }
        case e =>  {
            System.err.println(e.getMessage())
            0xFFFD
        }
    }
    val s = Source.fromFile("test.txt")(codec)
    s.getLines foreach println
}

Однако мой обработчик не вызывается, и программа вылетает с java.nio.charset.MalformedInputException.

Любые идеи, как зарегистрировать ошибку, вставить заменяющий символ и продолжить расшифровка?

...