8

我们正在使用外部服务以 CSV 格式获取数据。我们正在尝试将数据写入响应,以便可以将 csv 下载到客户端。不幸的是,我们正在获取以下格式的数据。

Amount inc. VAT      Balance
£112.83             £0.0
£97.55              £0.0
£15.28              £0.0

我们无法解码内容。有没有办法在java中解码£和显示。£

是否有任何 String Utils 可用于解码字符串。

4

3 回答 3

5

该文件似乎以 UTF-8 编码。您应该将其阅读为 UTF-8。

如果您使用java.io.FileReaderand company,则应打开 aFileInputStream并改用 an InputStreamReader

// Before: Reader in = new FileReader(file)
Reader in = new InputStreamReader(new FileInputStream(file), "UTF-8");

如果您正在使用其他方法来读取文件(可能是外部或内部类库?),请查看其文档是否允许指定用于读取文件的文本编码。

更新:如果您已经有一个类似 mojibake 的字符串£97.55并且无法修复它的读取方式,则重新编码的一种方法是将字符串转换回字节并将字节重新解释为 UTF-8。此过程不需要任何外部“StringUtils”或编解码器库;Java 标准 API 足够强大:

String input = ...obtain from somewhere...;
String output = new String(input.getBytes(/*use platform default*/), "UTF-8");
于 2012-10-16T07:03:11.280 回答
2

问题: 当我们在字符串上使用 getBytes() 时,它会尝试使用默认编码器进行解码。一旦字符串被编码,如果我们使用默认解码器,解码可能无法正常工作。

解决方案:apache 的一个 StringUtils 将帮助我们在回写响应时解码这些字符。这个类在org.apache.commons.codec.binary包中可用。

String CSVContent = "/* CSV data */";
/**
 *  Decode the bytes using UTF8.  
 */
String decodedStr = StringUtils.newStringUtf8(CSVContent.getBytes("UTF-8"));
/**
 *  Convert the decoded string to Byte array to write to the stream  
 */
Byte [] content = StringUtils.getBytesIso8859_1(decodedStr);

Maven 2.0 依赖项。

<dependency>
     <groupId>commons-codec</groupId>
     <artifactId>commons-codec</artifactId>
     <version>1.6</version>
</dependency>

解决方案:两个

根据@Joni,使用标准 API 的更好解决方案:

content = CSVContent.getBytes("ISO-8859-1");
于 2012-10-16T09:05:13.230 回答
1

我们很幸运现在拥有 Java 7。您可以使用 、 和 执行Paths以下Files操作StandardCharsets

Path path = Paths.get("/tmp", "input.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
for (String line : lines) {
    System.out.println(line);
}
于 2012-10-16T07:14:01.350 回答