3

我认为在 Windows 1252 代码页中有一些 Java 字符串(最初来自 Excel 表)。我希望它们转换为 Java 自己的 unicode 格式。Excel 文件是使用 JXL 包解析的,以防万一。

我要澄清一下:显然,从 Excel 文件中获取的字符串看起来很像它已经是某种 unicode。

WorkbookSettings ws = new WorkbookSettings();
ws.setCharacterSet(someInteger);
Workbook workbook = Workbook.getWorkbook(new File(filename), ws);
Sheet s = workbook.getSheet(sheet); 
row = s.getRow(4);
String contents = row[0].getContents();

这是内容似乎包含 unicode 的地方,åäö 是多字节字符,而 ASCII 是普通的单字节字符。它绝对不是Latin1。如果我用 printLn 打印“内容”字符串并将其重定向到 hello.txt 文件,我发现字母“ö”用两个字节表示,十六进制的 C3 B6。(十进制的 195 和 179。)

[编辑]

我已经尝试了下面给出的不同代码页等的建议,尝试从 Cp1252 等转换。有某种转换,因为我会得到一些其他类型的乱码。作为参考,我总是在源代码中打印一个手工编码的“ö”字符串,以验证我的终端或字体或任何东西没有问题。手动输入的“ö”始终有效。

[编辑]

我还按照评论中的建议尝试了 WorkBookSettings,但是我查看了 JXL 的代码,并且 characterSet 似乎被解析代码忽略了。我认为解析代码只是查看 XLS 文件应该使用的任何编码。

4

7 回答 7

5

WorkbookSettings ws = new WorkbookSettings();

ws.setEncoding("CP1250");

为我工作。

于 2009-04-21T15:02:09.823 回答
2

如果上面的答案都不能解决问题,那么技巧可能是这样的:

String myOutput = new String (myInput, "UTF-8");

这应该解码传入的字符串,无论其格式如何。

于 2010-08-23T15:09:35.203 回答
1

当 Java 解析文件时,它使用某种编码来读取磁盘上的字节并在内存中创建字节。默认编码因平台而异。Java 的内部字符串表示已经是 Unicode,所以如果它使用正确的编码解析文件,那么你已经完成了;只需以您想要的任何编码写出数据。

如果您在 Java 中查看字符串时出现损坏,可能是因为您使用了错误的编码来读取数据。Excel 可能正在使用 UTF-16(我认为是小尾数),但我希望像 JXL 这样的库应该能够适当地检测到它。我查看了 JXL 的 Javadocs,它对字符编码没有任何作用。我想它会根据需要自动检测任何编码。

您只需要将已加载的字符串写入文本文件吗?如果是这样,那么类似以下内容将起作用:

String text = getCP1252Text(); // doesn't matter what the original encoding was, Java always uses Unicode
FileOutputStream fos = new FileOutputStream("test.txt"); // Open file
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-16"); // Specify character encoding
PrintWriter pw = new PrintWriter(osw);

pw.print(text ); // repeat as needed

pw.close(); // cleanup
osw.close();
fos.close();

如果您的问题是其他问题,请编辑您的问题并提供更多详细信息。

于 2009-02-23T15:04:33.633 回答
1

您需要在解析文件时指定正确的编码 - 一旦您有一个基于错误编码的 Java 字符串,就为时已晚。

JXL 允许您通过将WorkbookSettings对象传递给工厂方法来指定编码。

于 2009-02-24T10:58:24.123 回答
0

JRE 不需要支持“windows-1252”/“Cp1252”,但 Sun (可能还有其他大多数)支持。请参阅 JDK 文档中的“支持的编码”。然后只需使用String,InputStreamReader或类似的方法将字节解码为字符。

于 2009-02-23T14:55:35.933 回答
0
FileInputStream fis = new FileInputStream (yourFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"CP1250"));

和 reader 一起做任何你直接对文件做的事情。

于 2009-02-23T15:14:17.337 回答
0

您的描述表明编码是 UTF-8,实际上 C3 B6 是 'ö' 的 UTF-8 编码。

于 2010-01-07T16:14:29.347 回答