【问题标题】:Android - Downloading KML file from internet results in garbled textAndroid - 从 Internet 下载 KML 文件会导致文本乱码
【发布时间】:2018-09-19 12:17:20
【问题描述】:

我正在尝试从国家气象局(第三个链接here)下载一个文件,将其作为文件保存在本地存储中,然后将该文件的内容转换为可用的字符串。但是,我遇到了一个问题,即文件中的文本被乱码成完全无法使用的字符和符号,尽管我知道实际的 KML 文件本身是可以查看的。

这是我用来下载文件的代码。我会注意到我对 Android 开发还很陌生,所以这段代码基本上是不同教程的合并。

编辑:下面的行是我在运行此代码时看到的示例。

PK�������~�L�]�[��S�������

protected String doInBackground(String... inputUrl) {
    int count;
    String filepath;
    String result = "";
    Date currentTime = Calendar.getInstance().getTime();

    try{
        File file = new File(context.getFilesDir(), "data_" + currentTime);
        URL url = new URL(inputUrl[0]);
        URLConnection connection = url.openConnection();
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream());
        BufferedOutputStream outputStream = new BufferedOutputStream(fileOutputStream, 8192);
        byte data[] = new byte[1024];

        while ((count = inputStream.read(data)) != -1){
            outputStream.write(data, 0, count);
        }

        outputStream.flush();
        outputStream.close();
        inputStream.close();

        filepath = file.getAbsolutePath();

        result = getStringFromFile(filepath);

    } catch (Exception e){
        Log.e("DownloadDataAsync", "Download data failed " + e.toString());
    }

    return result;
}

getStringFromFile() 函数来自 Stack Overflow 上的this 问题。

【问题讨论】:

  • 你在什么时候看到你说的结果是乱码 - 它是在'onPostExecute'还是异步任务的调用者。发布的代码作为独立的 java 工作。
  • 执行getStringFromFile() 后,生成的字符串只包含不可用的文本和符号。这将是onPostExecute,此时我看到的结果看起来像这样,尽管在调试中我可以看到文件的每一行在读入字符串时都显示为这些字符。我将使用我所看到的示例行来更新原始问题。
  • 似乎是编码问题,但文件是 UTF-8,默认流类型也是 UTF-8,所以看起来不是问题。
  • 一开始我也是这么想的。在我的问题中添加了结果字符串的第一行作为我所看到的示例。
  • 这很有趣 - PK(前 2 个字符)是 PKZip 文件的文件签名 - 也许只是巧合。

标签: java android android-studio


【解决方案1】:

我猜你错误地获取了 KMZ 文件(参考 NWS 页面上的第二个链接)。 KMZ 文件是 PKzip 压缩文件,文件签名为“PK”作为前 2 个字符字节。第二个链接中的文件将其作为第一个字节:

00000000h: 50 4B 03 04 14 00 02 00 08 00 45 81 8A 4C F5 BA ; PK........EŠLõº
00000010h: 5E 9E CD 06 02 00 13 95 07 00 07 00 1C 00 77 77 ; ^žÍ....•......ww

如果您尝试将其读取为字符串,则会导致发布的内容。

【讨论】:

  • 我不敢相信我花了这么多时间才下载了错误的文件。这当然是正确的!
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2014-09-08
  • 1970-01-01
  • 2012-12-25
  • 2022-01-10
相关资源
最近更新 更多