【发布时间】:2013-02-24 03:44:56
【问题描述】:
我需要检查文件的编码类型。如果它是可读的,则返回 true。
根据SO answer,我将此逻辑转换为 Java 代码。但它不起作用。正是,这部分代码:
if ((buffer[0] & 0xF8) == 0xF0) {
if (((buffer[1] & 0xC0) == 0x80)
&& ((buffer[2] == 0x80) && ((buffer[3] == 0x80))))
return true;
} else if ((buffer[0] & 0xF0) == 0xE0) {
if (((buffer[1] & 0xC0) == 0x80) && ((buffer[2] & 0xC0) == 0x80))
return true;
} else if ((buffer[0] & 0xE0) == 0xC0) {
if (((buffer[1] & 0xC0) == 0x80))
return true;
} return false;
这不正确检查,此时正在检查 100% UTF-8 代码! => 结果return false。
所有代码:
class EncodindsCheck implements Checker {
private static final int UTF8_HEADER_SIZE = 8;
@Override
public boolean check(File currentFile) {
return isUTF8(currentFile);
}
public static boolean isUTF8(File file) {
// validate input
if (null == file) {
throw new IllegalArgumentException("input file can't be null");
}
if (file.isDirectory()) {
throw new IllegalArgumentException(
"input file refers to a directory");
}
// read input file
byte[] buffer;
try {
buffer = readUTFHeaderBytes(file);
} catch (IOException e) {
throw new IllegalArgumentException(
"Can't read input file, error = " + e.getLocalizedMessage());
}
if ((buffer[0] & 0xF8) == 0xF0) {
if (((buffer[1] & 0xC0) == 0x80)
&& ((buffer[2] == 0x80) && ((buffer[3] == 0x80))))
return true;
} else if ((buffer[0] & 0xF0) == 0xE0) {
if (((buffer[1] & 0xC0) == 0x80) && ((buffer[2] & 0xC0) == 0x80))
return true;
} else if ((buffer[0] & 0xE0) == 0xC0) {
if (((buffer[1] & 0xC0) == 0x80))
return true;
}
return false;
}
private static byte[] readUTFHeaderBytes(File input) throws IOException {
byte[] buffer = new byte[UTF8_HEADER_SIZE];
// read data
FileInputStream fis = new FileInputStream(input);
fis.read(buffer);
fis.close();
return buffer;
}
}
问题:
- 为什么这个检查不起作用?
- 如何以这种方式解决此检查检测(作为 UTF-8 字符序列)?
- 如何检查其他字符集(UTF-16 等)?
【问题讨论】:
-
您能否提供一个失败的 UTF-8 文件示例?
-
@jazzbassrob 我该怎么做?
-
您是否阅读了原始的 SO 答案?缓冲区 [0] 甚至有一个字节 > 0x7f 吗?
-
@Ingo 你建议如何改变这种方法?
-
我没有。我只是指出,您链接到的 SO 答案引入了此逻辑,以查看以 byte > 0x7f 开头的字节序列是否形成有效的 UTF8 代码。
标签: java character-encoding decoding