【问题标题】:Convert from Codepage 1252 (Windows) to Java, in Java在 Java 中从 Codepage 1252 (Windows) 转换为 Java
【发布时间】:2010-10-09 08:03:42
【问题描述】:

我认为在 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 等转换。有某种转换,因为我会得到一些其他类型的乱码。作为参考,我总是在源代码中打印一个手工编码的“ö”字符串,以验证我的终端或字体或任何东西没有问题。手动输入的“ö”始终有效。

[编辑]

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

【问题讨论】:

  • Java自己的unicode格式是UTF-16,iirc。

标签: java windows unicode codepages


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      WorkbookSettings ws = new WorkbookSettings();

      ws.setEncoding("CP1250");

      为我工作。

      【讨论】:

      • 令人惊讶的工作!谢谢。还节省了我一半的时间。
      【解决方案4】:

      你需要在解析文件的时候指定正确的编码——一旦你有了一个基于错误编码的Java字符串,那就太迟了。

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

      【讨论】:

      • 谢谢!我会尝试这样做,并希望回到这个话题,让大家看看它是如何工作的。
      【解决方案5】:
      FileInputStream fis = new FileInputStream (yourFile);
      BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"CP1250"));
      

      然后用阅读器做任何你直接用文件做的事情。

      【讨论】:

        【解决方案6】:

        当 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();
        

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-04-09
            • 1970-01-01
            • 2011-05-22
            • 2014-05-29
            • 1970-01-01
            • 2014-05-06
            • 1970-01-01
            相关资源
            最近更新 更多