gpt4 book ai didi

java - Java 中的 iconv 等效代码不会返回相同的结果

转载 作者:行者123 更新时间:2023-11-30 09:22:47 25 4
gpt4 key购买 nike

我需要将文件从 UTF-8 编码为 Shift_JIS。以前,这是使用 iconv 命令完成的,如下所示

iconv -f utf8 -t sjis $INPUT_FILE 

我提供的输入文件返回一个错误,说

Illegal input sequence at position 2551

我写了这段 Java 代码:

FileInputStream fis = new FileInputStream(
"Input.txt");
InputStreamReader in = new InputStreamReader(fis, "UTF-8");
FileOutputStream fos = new FileOutputStream("Output.txt");
OutputStreamWriter out = new OutputStreamWriter(fos, "Shift_JIS");

int val = 0;
StringBuilder sb = new StringBuilder();

while((val =in.read() )!= -1){
System.out.println(Integer.toHexString(val));
sb.append((char)val);
}
out.write(sb.toString());
out.flush();
fis.close();
out.close();

代码在相同的输入文件下执行良好,不会返回任何错误。

我在这里遗漏了什么吗?

约阿希姆。这看起来像答案。我在问题中添加了我的代码。我现在遇到无法映射的字符错误。但它无法对任何文本“hello”等普通字符进行编码。我是不是哪里做错了

    private static CharsetDecoder decoder(String encoding) {
return Charset.forName(encoding).newDecoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
}

private static CharsetEncoder encoder(String encoding) {
return Charset.forName(encoding).newEncoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
}

public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(
"D:\\Input.txt");
InputStreamReader in = new InputStreamReader(fis, decoder("UTF-8"));
FileOutputStream fos = new FileOutputStream("D:\\Output.txt");
OutputStreamWriter out = new OutputStreamWriter(fos, encoder("Shift_JIS"));
char[] buffer = new char[4096];
int length;

while ((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}

out.flush();
}

最佳答案

那应该只是一个关于 UTF-8 的问题。只需执行一个 InputStream 并从位置 2551 开始十六进制转储,或者前面的文本稍早一点。

特别有趣的是,iconv 在那里提供了什么。


转储:

这样我们就可以知道是哪些数据导致了问题。

public static void main(String[] args) {
try (BufferedInputStream in = new BufferedInputStream(
new FileInputStream("D:\\input.txt"))) {
dumpBytes(in, 2551 - 10, 20);
} catch (IOException ex) {
ex.printStackTrace();
}
}

private static void dumpBytes(InputStream in, long offset, int length)
throws IOException {
long pos = in.skip(offset);
while (length >= 0) {
int b = in.read();
if (b == -1) {
break;
}
b &= 0xFF;
System.out.printf("%6d: 0x%02x %s '%c'%n", pos, b,
toBinaryString(b), (32 <= b && b < 127 ? (char)b : '?'));

--length;
++pos;
}
}

private static String toBinaryString(int b) {
String s = Integer.toBinaryString(b);
s = "00000000" + s;
s = s.substring(s.length() - 8);
s = s.substring(0, 4) + "_" + s.substring(4);
return s;
}

关于java - Java 中的 iconv 等效代码不会返回相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16338840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com