【问题标题】:How do I convert List<String[]> values from UTF-8 to String?如何将 List<String[]> 值从 UTF-8 转换为 String?
【发布时间】:2014-09-19 00:27:50
【问题描述】:

我想将一些希腊文本从 UTF-8 转换为字符串,因为 Java 无法识别它们。然后,我想将它们填充到 JTable 中。所以我使用 List 来帮助我。下面我有代码sn-p:

String[][] rowData;
List<String[]> myEntries;
//...
try {
        this.fileReader = new FileReader("D:\\Book1.csv");
        this.reader = new CSVReader(fileReader, ';');
        myEntries = reader.readAll();

        //here I want to convert every value from UTF-8 to String
        convertFromUTF8(myEntries); //???

        this.rowData = myEntries.toArray(new String[0][]);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(VJTable.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(VJTable.class.getName()).log(Level.SEVERE, null, ex);
    }
//...

我创建了一个方法

public String convertFromUTF8(List<String[]> s) {
    String out = null;
    try {
        for(String stringValues : s){
            out = new String(s.getBytes("ISO-8859-1"), "UTF-8");
        }
    } catch (java.io.UnsupportedEncodingException e) {
        return null;
    }
    return out;
}

但我无法继续,因为 List 没有 getBytes() 方法。 我该怎么办。任何想法都会非常有帮助。提前谢谢你。

【问题讨论】:

  • 那么,我必须将 UTF-8 转换为 UTF-16 吗?
  • 另外,Java 实现确实支持 UTF-8。是什么让您相信它们不被 Java 认可?有什么错误,坏字符吗?
  • 坏字符..它返回矩形而不是字母...
  • 您用来查看的工具可能不支持 UTF-8。
  • 像 NetBeans 工具还是像 JTable 工具这样的工具?我应该如何让它识别 UTF-8?

标签: java string utf-8 character-encoding


【解决方案1】:

要将 UTF-8 字节解码为 Java 字符串,您可以执行以下操作(取自 this

Charset UTF8_CHARSET = Charset.forName("UTF-8");

String decodeUTF8(byte[] bytes) {
    return new String(bytes, UTF8_CHARSET);
}

将数据读入字符串后,您将无法再控制编码。 Java 在内部将字符串存储为 UTF-16。如果您正在读取的 CSV 文件是使用 UTF-8 编码写入的,您应该将其以 UTF-8 格式读取到字节数组中。然后您再次使用上述方法将字节数组解码为 Java 字符串。现在,一旦您拥有完整的字符串,您可能会考虑根据分隔符或其他参数将其拆分为字符串列表(我不知道您拥有的数据)。

【讨论】:

  • 虽然这可行,但使用 InputStreamReader 通常是更好的选择,尤其是对于较大的内容(例如整个 csv 文件)。
  • 是的,我还没有谈到如何读入字节数组,你的观点确实填补了空白。
  • 在评论中也提到了答案来自:从1.7开始你可以使用常量StandardCharsets.UTF_8,它和第一行一样。
【解决方案2】:

问题是您使用的FileReader 只支持“默认”字符集:

this.fileReader = new FileReader("D:\\Book1.csv");

FileReader 的 javadoc 对此非常清楚:

这个类的构造函数假定默认字符 编码和默认字节缓冲区大小是合适的。指定 这些值自己,在一个上构造一个 InputStreamReader 文件输入流。

获取指定字符集的Reader的适当方法如下:

this.fileStream = new FileInputStream("D:\\Book1.csv");
this.fileReader = new InputStreamReader(fileStream, "utf-8");

【讨论】:

  • 你在哪里显示?该字体/应用程序是否支持希腊字符字形?您确定源数据编码为 utf-8 吗?
  • 是的,我确定。我使用fileReader.getEncoding() 方法返回编码。 UTF8,它说。我在 JTable 上显示,但我不知道该字体是否支持希腊语。我怎么看?
  • getEncoding 只返回正在使用的内容。它不是来自内容本身。您是否有导致问题的字符的字节值以及您期望的字符? docs.oracle.com/javase/7/docs/api/java/io/…
  • 你能告诉我我应该如何从 List myEntries 中获取它吗?
  • @VassilisDe 你读错了。这个答案是正确的。您需要使用正确的输入流阅读器。见this answer
猜你喜欢
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 2013-09-26
  • 2020-01-11
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多