如何将编码更改为下载的文件Kotlin

如何将编码更改为下载的文件Kotlin,kotlin,character-encoding,exoplayer,video-encoding,exoplayer2.x,Kotlin,Character Encoding,Exoplayer,Video Encoding,Exoplayer2.x,我正在制作一个应用程序,它将下载一个.zip文件,解压它,最后将.srt文件(已压缩)作为字幕文件放入exoplayer电影中 我的问题 文件中有希腊字母,当我把它作为字幕文件时,我只看到损坏的字母 我试过什么 下面是解压文件的代码 fun writeZipAndUnZip(subtitlesLinks: ArrayList<String>, context: Context, body: ResponseBody?) { if (body == null)

我正在制作一个应用程序,它将下载一个.zip文件,解压它,最后将.srt文件(已压缩)作为字幕文件放入exoplayer电影中

  • 我的问题
文件中有希腊字母,当我把它作为字幕文件时,我只看到损坏的字母

  • 我试过什么
下面是解压文件的代码

    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)
    }}
我还尝试使用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()
    }

可能您试图读取的文件的编码与系统默认编码不同(Android使用
utf-8
)。您需要以“正确”的编码格式读取文件(希腊语通常为
Windows-1253
),然后将其保存到
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()
    }