Как изменить кодировку для загруженного файла Kotlin - PullRequest
1 голос
/ 23 января 2020

Я создаю приложение, которое загрузит файл .zip, разархивирует его и, наконец, возьмет файл .srt (который был заархивирован) и поместит его как файл субтитров в exoplayer mov ie.

  • Моя проблема

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

  • Что я пробовал

Ниже приведен код для распаковки файла

    fun writeZipAndUnZip(subtitlesLinks: ArrayList<String>, context: Context, body: ResponseBody?) {

    if (body == null) { return }

    val file = File(getSubsDirectory(), subtitlesLinks.first())

    var inputStream: InputStream? = null
    var outputStream: OutputStream? = null

    try {
        val fileReader = ByteArray(4096)

        inputStream = body.byteStream()
        outputStream = FileOutputStream(file)

        while (true) {
            var read = inputStream.read(fileReader)

            if (read == -1) {
                break
            }

            outputStream.write(fileReader, 0, read)
        }

        outputStream.flush()

        unzip(context)
    } catch (e: IOException) {
        return
    } finally {
        inputStream?.close()
        outputStream?.close()
    }}

fun unzip(context: Context) {

    val unzipPath = getSubsDirectory()
    var count: Int
    val buffer = ByteArray(4096)
    val subFile = File(getSubsDirectory()).listFiles()?.first() ?: return
    try {
        val stream = FileInputStream(subFile.absolutePath)

        ZipInputStream(stream).use { zis ->
            var ze = ZipEntry("")
            while (zis.nextEntry?.also { ze = it } != null) {
                var fileName = ze.name
                fileName = fileName.substring(fileName.indexOf("/") + 1)
                val file = File(unzipPath, fileName)
                val dir = if (ze.isDirectory) file else file.parentFile

                if (!dir.isDirectory && !dir.mkdirs())
                    throw FileNotFoundException("Invalid path: " + dir.absolutePath)
                if (ze.isDirectory) continue
                val fileOutput = FileOutputStream(file)
                try {
                    while (zis.read(buffer).also { count = it } != -1)
                        fileOutput.write(buffer, 0, count)
                } catch (e: IOException) {
                    Timber.tag("ErrorZip").d(e.localizedMessage)
                } finally {
                    val fileOutput = context.openFileOutput(fileName, Context.MODE_PRIVATE)
                    fileOutput.close()
                }
            }
        }

    } catch (e: IOException) {
        Timber.tag("ErrorZip").d(e.localizedMessage)
    }}

Вот код, который я поместил в exoplayer для субтитров

 val subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.APPLICATION_SUBRIP, Format.NO_VALUE, "el")
    val subtitleSource = SingleSampleMediaSource(File(Utils.getSubsDirectory()).listFiles()!![1].toUri(), dataSourceFactory, subtitleFormat, C.TIME_UNSET)
    mediaSource = MergingMediaSource(buildMediaSource(videoUrl), subtitleSource)

Я также пытался восстановить субтитры с кодировкой Utf-8, но я получил некоторые символы на греческом языке, и большинство из них пропущено или неверно, используя этот код

fun encode() {
        val charset = "UTF8"

        val subFile = File(getSubsDirectory()).listFiles()!![1] ?: return

        val inputStream: InputStream = subFile.absoluteFile.inputStream()
        val inputString = inputStream.bufferedReader().use { it.readText() }

        val writer = OutputStreamWriter(FileOutputStream(File(getSubsDirectory(), "subs.srt")), charset)
        writer.write(inputString)
        writer.close()
    }

1 Ответ

1 голос
/ 23 января 2020

Возможно, файл, который вы пытаетесь прочитать, находится в кодировке, отличной от значения по умолчанию системы (Android использует utf-8). Вам необходимо прочитать файл в «правильном» формате кодировки (для греческого обычно это Windows-1253), а затем сохранить его в utf-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...