Java的默认编码为ASCII
。是?(请参见下面的编辑)
当文本文件被编码为UTF-8
?读者如何知道自己必须使用UTF-8
?
我谈论的读者是:
FileReader
sBufferedReader
来自的Socket
sScanner
从System.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
以相同的代码点范围。
您可能会发现每个博客都很有趣:
我正试图让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阅读器。