【问题标题】:FTP server output and accentsFTP 服务器输出和重音
【发布时间】:2011-02-11 16:04:38
【问题描述】:

我编写了这个小测试类来连接到 FTP 服务器。

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class FTPTest {

    public static void main(String[] args) {
        URL url = null;

        try {
            url = new URL("ftp://anonymous:Password@127.0.0.1");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        URLConnection conn = null;

        try {
            conn = url.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }

        InputStream in = null;

        try {
            in = conn.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedInputStream bin = new BufferedInputStream(in);
        int b;

        try {
            while ((b = bin.read()) != -1) {
                char c = (char) b;
                System.out.print("" + (char) b);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这是输出:

-rw-r--r-- 1 ftp ftp           4700 Apr 30  2007 premier.java
-rw-r--r-- 1 ftp ftp          88576 Oct 23  2007 Serie1_1.doc
-rw-r--r-- 1 ftp ftp           1401 Nov 21  2006 tp20061121.txt
drwxr-xr-x 1 ftp ftp              0 Apr 23 20:04 répertoire

注意列表末尾的目录名称。应该有一个“é”(带重音的 e)而不是双字符“é”。

这让我想起了以前在 JSF 中遇到的一个问题,即标准之间的混淆。我对字符编码几乎没有经验,所以我不确定发生了什么。我假设服务器输出是 ASCII 格式,那么如何调整输出以使其在控制台中正确显示?

【问题讨论】:

    标签: java ftp character-encoding diacritics


    【解决方案1】:

    您正在使用暴力将输入流中的bytes 转换为chars

    char c = (char) b;
    

    这绝对不是 Good Housekeeping 批准的表格。

    Streams 提供bytes,而你想要chars。 Readers 提供chars 并以自动和可控的方式为您进行字符集翻译。

    您应该将InputStreamReader 包裹在InputStream 周围。 InputStreamReader 的构造函数允许您指定 CharSet,这将让您控制翻译。

    InputStreamReader 读取当然会产生“真实的”chars。另一个好处是您可以将BufferedReader 包裹在InputStreamReader 周围,然后使用readLine 一次读取整行(到String)。


    编辑:为了说明我所说的“环绕”,这里有一些(未经测试!)编码来说明这个想法:

    BufferedReader br = new BufferedReader(new InputStreamReader(bin, "US-ASCII"));
    ...
    String line = br.readLine();
    

    【讨论】:

    • 所以我是。所以这意味着Java中的字符是Unicode。感谢您提供有关组合不同输入类的提示。这实际上回答了我的另一个问题。
    • 是的,Java 字符确实是 Unicode。当您将字节转换为字符时,您实际上是将这些字节视为 ASCII 字符。我为 Java IO 的严重笨拙表示歉意。很高兴有不同的类可用于这么多用途,但有些人想知道事情是否需要像它们一样复杂。
    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多