通过ftp文件上传问题

时间:2014-12-25 19:43:36

标签: java utf-8 ftp

我有问题通过FTP将文件上传到我的服务器。该文件是一个json文件,我读得很好,没有符号。这是我上传文件的代码:

   public static void subir(){
        String server = server;
        int port = 21;
        String user = user;
        String pass = pass;

        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("UTF-8");

        try {

            ftpClient.connect(server, port);
            ftpClient.login(user, pass);
            ftpClient.enterLocalPassiveMode();

            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            // Uploads first file using an InputStream
            File firstLocalFile = new File("my.json");

            String firstRemoteFile = "Folder/my.json";
            InputStream inputStream = new FileInputStream(firstLocalFile);

            System.out.println("Subiendo archivo a servidor...");
            boolean done = ftpClient.storeFile(firstRemoteFile, inputStream);
            inputStream.close();
            if (done) {
                System.out.println("great");
            }


        } catch (IOException ex) {
            System.out.println("Error: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }

问题是,当我打开包含我文件的网址时,我会用符号读取我的信息,例如parecÃa而不是parecía,Giménez而不是Giménez。有人能帮助我吗?感谢

我手动创建了json:

sBuffer = new StringBuffer();
         a= "{\"results\":[";
         sBuffer.append(a);

        for (int z=0; z< myarray.size(); z++){
          if (z<(myarray.size()-1)){
              b="{\"one\":\""+ myarray.get(z).getOne()+"\",\"twoo\":\""+ myarray.get(z). getTwoo()+"\",\"three\":\""+ myarray.get(z).getThree()+"\"},";
              sBuffer.append(b);
          }
          else{
              c="{\"one\":\""+ myarray.get(z). getOne()+"\",\"twoo\":\""+ myarray.get(z).getTwoo()+"\",\"three\":\""+myarray.get(z). getThree()+"\"}]}";
              sBuffer.append(c);
          }

        }

1 个答案:

答案 0 :(得分:0)

总结我的评论:

包含不在ASCII范围内的字符的JSON文件(如éñ)可以用两种方式表示:

  1. 纯ASCII文件。所有&#34;特别&#34;字符由unicode转义序列表示。例如,é将表示为\u00E9ñ\u00F1。文件中的数据实际上是字符\u00F1,但任何好的JSON解释器将读取并将其内部转换为正确的字符。

  2. 编码文件。 &#34;特别&#34;根据您保存的特定编码,字符由8位字节表示。如果您选择UTF-8,则é文件中保存的实际字节为0xC3 0xC9。对于ñ,字节为0xC3 0xB1。这就是UTF-8编码的工作原理 - 每个&#34;特殊&#34;字符由两个或多个8位字节表示。

  3. 现在您已经创建了一个UTF-8文件并将其成功放置在服务器上 。它是成功的,因为您使用二进制传输方法,这意味着它不进行任何编码,只是将字节完全按原样传递给服务器。

    问题是你如何阅读数据。

    每个HTTP URL在响应请求时,会发送一个标题,告诉浏览器或程序读取它返回的响应类型,字符的编码是。< / p>

    例如,如果URL发送标题:

    Content-type: text/html; charset="ISO-8859-1"

    然后浏览器或阅读程序知道(a)此文件包含HTML格式的文本数据,以及(b)其字符编码为ISO-8859-1

    如果URL发送标题:

    Content-type: text/plain; charset="UTF-8"

    然后浏览器或阅读程序知道(a)此文件包含没有特定格式的文本,(b)其字符编码为UTF-8

    在您的情况下,问题是URL提供以UTF-8编码的文件。但它的标题表示内容类型为ISO-8859-1

    这意味着当浏览器看到浏览器发送的字节序列C3 A9时,它应该是é,它会根据{{1}来解释它们编码。在该编码中,每个字节都是一个单独的字符。 ISO-8859-1 C3实际为ÃISO-8859-1A9。因此,您在浏览器中看到的内容是©,而不是é。发送的数据是相同的字节序列。该文件未更改。但由于标题,您的浏览器/阅读器在内部对其进行了转换,并将其显示为不同的字符。

    你是如何解决这个问题的?

    1. 创建文件时,使用转义序列é创建文件。无论HTTP响应的编码是\uXXXXUS-ASCII编码还是ISO-8859,都可以使用。

    2. URL由某种Web程序操作:servlet,PHP脚本或其他东西。该程序应该发送正确的UTF-8标题,当然不是Content-type。 JSON的正确内容类型应为ISO-8859-1。如果发送它,则不需要设置字符集,因为您只对application/json编码执行此操作,而不是对text/*进行字节流编码。像Firefox这样的常规浏览器可能会或可能不会理解,但是应该读取JSON URL的程序应该理解这一点,并自动将JSON数据解释为UTF-8。但是,如果这不起作用(因为您实际上是使用某些文本工具或Internet Explorer查看数据,而不是特定于JSON的数据),则可以将标头设置为application/*,或{{1} }。

      请注意,如果您要访问text/plain; charset="UTF-8"等直接网址,则表示网络服务器(apache,IIS,无论如何)根据text/javascript; charset="UTF-8"后缀的配置设置设置标头。在这种情况下,您必须更改该后缀的服务器配置。


    3. 要在创建JSON文件时以编程方式将字符串转换为转义格式,您可以执行以下操作之一(按从最好到最差的顺序):

      • 使用适当的JSON库来创建JSON。
      • 使用适当的字符串操作库来取消字符串。例如,Apache Commons StringEscapeUtils
      • 使用此类方法将字符串的字符附加到http://server/folder/file.json

        .json