我有一些Java中的字符串(最初来自Excel工作表),我认为它在Windows 1252代码页中。我希望他们转换为Javas自己的unicode格式。如果重要的话,使用JXL包解析Excel文件。
我将澄清:显然,从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是正常的单字节字符。绝对不是拉丁文1。如果我用printLn打印“contents”字符串并将其重定向到hello.txt文件,我发现字母“ö”用两个字节表示,C3 B6用十六进制表示。 (十进制195和179)。
[编辑]
我尝试了下面给出的不同代码页等的建议,尝试从Cp1252等转换。有某种转换,因为我会得到一些其他类型的乱码。作为参考,我总是在源代码中打印一个“ö”字符串,以验证我的终端或字体或任何东西没有问题。手动输入的“ö”始终有效。
[编辑]
我也按照评论中的建议尝试了WorkBookSettings,但是我查看了JXL的代码,并且通过解析代码似乎忽略了characterSet。我认为解析代码只是查看XLS文件应该在的任何编码。
答案 0 :(得分:5)
WorkbookSettings ws = new WorkbookSettings();
ws.setEncoding( “CP1250”);
为我工作。
答案 1 :(得分:2)
如果上述答案都没有解决问题,可以这样做:
String myOutput = new String (myInput, "UTF-8");
这应该解码传入的字符串,无论其格式如何。
答案 2 :(得分:1)
当Java解析文件时,它使用一些编码来读取磁盘上的字节并在内存中创建字节。默认编码因平台而异。 Java的内部String表示已经是Unicode,所以如果它使用正确的编码解析文件,那么你已经完成了;只需用你想要的任何编码写出数据。
如果在Java中查看它们时字符串出现损坏,可能是因为您使用了错误的编码来读取数据。 Excel可能正在使用UTF-16(Little-Endian,我认为),但我希望像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();
如果您的问题不是其他问题,请编辑您的问题并提供更多详细信息。
答案 3 :(得分:1)
解析文件时需要指定正确的编码 - 一旦你有一个基于错误编码的Java字符串,就太晚了。
JXL允许您通过将WorkbookSettings
对象传递给工厂方法来指定编码。
答案 4 :(得分:0)
“Windows-1252”/“Cp1252”不需要JRE支持,但是由Sun(并且可能是大多数其他人)支持。请参阅JDK文档中的"Supported Encodings"。然后,只需使用String
,InputStreamReader
或类似内容将字节解码为字符。
答案 5 :(得分:0)
FileInputStream fis = new FileInputStream (yourFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"CP1250"));
与读者一起做任何你直接用文件做的事情。
答案 6 :(得分:0)
您的描述表明编码是UTF-8,实际上C3 B6是'ö'的UTF-8编码。