如何在SJIS文件中阅读本文①②?

时间:2015-04-21 16:38:51

标签: java csv unicode

如何获取这些字符①②

我正在使用Java 1.6来读取包含这些字符的csv文件(使用SJIS编码),并且在运行程序时我只返回��

public class Example {
    public static void main(String[] args) throws IOException {
        StringBuffer buffer = new StringBuffer();
        FileInputStream fis = new FileInputStream(new File("examples/input.csv"));
        InputStreamReader isr = new InputStreamReader(fis, "SJIS");
        Reader in = new BufferedReader(isr);

        int ch;
        while ((ch = in.read()) > -1) {
            buffer.append((char)ch);
        }
        in.close();

        System.out.println(buffer.toString());
    }
}

输入

input.csv的内容:

"備考"
①②ランプ

实际输出

 �@�Aランプ

预期产出

"①②ランプ"

2 个答案:

答案 0 :(得分:5)

Shift-JIS字符集不包含字符①和②。

您的文件未保存在标准Shift-JIS中,这是您在Java中以名称SJIS获得的编码。它实际上是Windows code page 932,是一个特定于Microsoft的Shift-JIS扩展, 包含①②。您可以使用名称windows-932

在Java中获取此编码

答案 1 :(得分:0)

在我看来,您可能需要设置程序用于打印的控制台/终端的编码。


这可能不是您正在寻找的答案,但如果您使用的是Eclipse,则可以尝试以下操作。根据您的问题,输出是正确的。

Eclipse IDE

在Eclipse中,如果单击运行按钮旁边的向下箭头,您应该会看到“运行配置...”选项。如果选择“公共”选项卡,则应看到标记为“编码”的表单字段集。选择“其他”单选按钮并将选择更改为“UTF-8”。

enter image description here

工作示例

我稍微修改了一下代码,通过项目加载文件。我还使用Character.toChars(ch)而不是(char) ch作为解析字符的更强大的方法。 Character.toChars函数“将指定字符(Unicode代码点)转换为存储在char数组中的UTF-16表示形式。”

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URISyntaxException;

public class App {
    public static void main(String[] args) {
        try {
            StringBuffer buffer = new StringBuffer();
            FileInputStream fis = loadResource("resources/input.csv");
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            Reader in = new BufferedReader(isr);

            int ch;
            while ((ch = in.read()) > -1) {
                buffer.append(Character.toChars(ch));
            }
            in.close();

            System.out.println(buffer.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    private static final FileInputStream loadResource(String name) throws FileNotFoundException, URISyntaxException {
        return new FileInputStream(new File(App.class.getClassLoader().getResource(name).toURI()));
    }
}