当前位置: 首页 > 面试题库 >

Java:阅读器和编码

朱高丽
2023-03-14
问题内容

Java的默认编码为ASCII。是?(请参见下面的编辑)

当文本文件被编码为UTF-8?读者如何知道自己必须使用UTF-8

我谈论的读者是:

  • FileReaders
  • BufferedReader来自的Sockets
  • 一个ScannerSystem.in

轮到我们,编码取决于操作系统,这意味着以下内容并非在每个操作系统上都适用:

'a'== 97

问题答案:

读者如何知道他必须使用UTF-8?

通常你指定 你自己
的一个InputStreamReader。它有一个采用字符编码的构造函数。例如

Reader reader = new InputStreamReader(new FileInputStream("c:/foo.txt"), "UTF-8");

所有其他读者(据我所知)都使用平台默认字符编码,这实际上可能不是正确的编码(例如 -cough- CP-1252)。

从理论上讲,您还可以根据字节顺序标记自动检测字符编码。这将几种unicode编码与其他编码区分开来。不幸的是Java
SE对此没有任何API,但是您可以自制一个可以用来替换的API,InputStreamReader如上面的示例所示:

public class UnicodeReader extends Reader {
    private static final int BOM_SIZE = 4;
    private final InputStreamReader reader;

    /**
     * Construct UnicodeReader
     * @param in Input stream.
     * @param defaultEncoding Default encoding to be used if BOM is not found,
     * or <code>null</code> to use system default encoding.
     * @throws IOException If an I/O error occurs.
     */
    public UnicodeReader(InputStream in, String defaultEncoding) throws IOException {
        byte bom[] = new byte[BOM_SIZE];
        String encoding;
        int unread;
        PushbackInputStream pushbackStream = new PushbackInputStream(in, BOM_SIZE);
        int n = pushbackStream.read(bom, 0, bom.length);

        // Read ahead four bytes and check for BOM marks.
        if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
            encoding = "UTF-8";
            unread = n - 3;
        } else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
            encoding = "UTF-16BE";
            unread = n - 2;
        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
            encoding = "UTF-16LE";
            unread = n - 2;
        } else if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
            encoding = "UTF-32BE";
            unread = n - 4;
        } else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
            encoding = "UTF-32LE";
            unread = n - 4;
        } else {
            encoding = defaultEncoding;
            unread = n;
        }

        // Unread bytes if necessary and skip BOM marks.
        if (unread > 0) {
            pushbackStream.unread(bom, (n - unread), unread);
        } else if (unread < -1) {
            pushbackStream.unread(bom, 0, 0);
        }

        // Use given encoding.
        if (encoding == null) {
            reader = new InputStreamReader(pushbackStream);
        } else {
            reader = new InputStreamReader(pushbackStream, encoding);
        }
    }

    public String getEncoding() {
        return reader.getEncoding();
    }

    public int read(char[] cbuf, int off, int len) throws IOException {
        return reader.read(cbuf, off, len);
    }

    public void close() throws IOException {
        reader.close();
    }
}

编辑 作为对您的编辑的答复:

因此编码取决于操作系统。 因此,这意味着并非在每个操作系统上都是如此:

'a'== 97

不,这不是真的。的ASCII(其含有128个字符,编码0x00,直到与0x7F)为
基础
的所有其它的字符编码。只有字符ASCII集以外的字符可能会冒用其他编码显示不同的风险。该ISO-8859编码涵盖了人物ASCII以相同的代码点范围。该Unicode编码涵盖了人物ISO-8859-1以相同的代码点范围。

您可能会发现每个博客都很有趣:

  1. 每个软件开发人员绝对,肯定必须了解的Unicode和字符集的绝对最低要求(无借口!)(两者的更多理论依据)
  2. Unicode-如何正确获取字符?(两者更实用)


 类似资料:
  • 我正试图让Jersey支持GSON,为此我了解到我需要实现一个自定义的MessageBodyWriter和MessageBodyReader。 现在我的问题是我找不到这两个接口的任何明确定义。 从文档中: 支持将Java类型转换为流的提供程序的契约。要添加MessageBodyWriter实现,请使用@Provider注释实现类。MessageBodyWriter实现可以使用Produces注释以

  • 在问题[1]中,我了解到如果您想在Android下使用NFC标签,则不必采用NDEF格式。我想在Win 8.1 in. Net下执行此操作。我的情况是这样的: 我有一个RFID卡Mifare Classic 1K,其中存储了一个ID。(由制造商记录)该ID由我们的考勤系统通过通常的RFID读取器(例如Gigatek的PROMAG MFR120)读取。我们不在卡上写任何东西,我们只需要读取ID。但是

  • RSS 阅读器用于读取 RSS feed! RSS 阅读器可供许多不同的设备和操作系统使用。 RSS 阅读器 有很多不同的 RSS 阅读器。某些以 web services 的形式来工作,而某些则运行于 windows (或 Mac、PDA 或 UNIX)。 这是一些我尝试过并钟爱的阅读器: 这是一些我尝试过并钟爱的阅读器: RSS 阅读器 有很多不同的 RSS 阅读器。某些以 web servi

  • 问题内容: 今天我收到了这个问题,我想我回答的很不好。我说过流是流动的数据,而阅读器是一种我们从中读取的技术,它是静态数据。我知道这是一个糟糕的答案,因此请通过Java示例为我提供这两者之间的清晰区别和定义。 谢谢。 问题答案: 正如其他人所说,每种情况的用例略有不同(即使它们经常可以互换使用) 由于阅读器用于读取字符,因此当您处理文本性质的输入(或以字符表示的数据)时,它们会更好。我之所以说得更

  • 问题内容: 我有一个InputStream,可以从中读取字符。我希望多个读者访问此InputStream。看来,实现此目标的合理方法是将传入数据写入StringBuffer或StringBuilder,并由多个读取器读取。不幸的是,不建议使用StringBufferInputStream。StringReader读取字符串,而不是不断更新的可变对象。我有什么选择?写我自己的? 问题答案: 输入流的

  • Android PDF Viewer 是Android平台下的PDF阅读器。