javacharacter-encodingzipoutputstream

How do I write chinese charactes in ZipEntry?


I want to export a string(chinese text) to CSV file inside a zip file. Where do I need to set the encoding to UTF-8? Or what approach should I take (based on the code below) to display chinese characters in the exported CSV file?

This is the code I currently have.

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ZipOutputStream zipOut = new ZipOutputStream(out, StandardCharsets.UTF_8)
        try {
            ZipEntry entry = new ZipEntry("chinese.csv");
            zipOut.putNextEntry(entry);
            zipOut.write("类型".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            zipOut.close();
            out.close();
        }

Instead of "类型", I get "类型" in the CSV file.


Solution

  • First, you definitely need to change zipOut.write("类型".getBytes()); to zipOut.write("类型".getBytes(StandardCharsets.UTF_8)); Also, when you open your resultant CSV file, the editor might not be aware that the content is encoded in UTF-8. You may need to tell your editor that it is UTF-8 encoding. For instance, in Notepad, you can save your file with "Save As" option and change encoding to UTF-8. Also, your issue might be just wrong display issue rather than actual encoding. There is an Open Source Java library that has a utility that converts any String to Unicode Sequence and vice-versa. This utility helped me many times when I was working on diagnosing various charset related issues. Here is the sample what the code does

    result = "Hello World";
    result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
    System.out.println(result);
    result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
    System.out.println(result);
    

    The output of this code is:

    \u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
    Hello World
    

    The library can be found at Maven Central or at Github It comes as maven artifact and with sources and javadoc

    Here is javadoc for the class StringUnicodeEncoderDecoder

    I tried your inputs and got this:

    System.out.println(StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("类型"));
    System.out.println(StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("类型"));
    

    And the output was:

    \u7c7b\u578b
    \u00e7\u00b1\u00bb\u00e5\u017e\u2039
    

    So it looks like you did lose the info, and it is not just a display issue