GZIPInputStream и Набор символов
У меня есть текст, содержащий латинские, кириллические и китайские иероглифы. Я пытаюсь сжать строку (более bytes[]
) с GZIPOutputStream
и распакуйте его с помощью GZIPInputStream. Но мне не удается преобразовать все символы обратно в оригинальные символы. Некоторые появляются как ?
,
Я думал, что UTF-16 сделает работу.
Любая помощь?
С уважением
Вот мой код:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.Inflater;
import java.util.zip.ZipException;
public class CompressUncompressStrings {
public static void main(String[] args) throws UnsupportedEncodingException {
String sTestString="äöüäöü 长安";
System.out.println(sTestString);
byte bcompressed[]=compress(sTestString.getBytes("UTF-16"));
//byte bcompressed[]=compress(sTestString.getBytes());
String sDecompressed=decompress(bcompressed);
System.out.println(sDecompressed);
}
public static byte[] compress(byte[] content){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try{
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
gzipOutputStream.write(content);
gzipOutputStream.close();
} catch(IOException e){
throw new RuntimeException(e);
}
return byteArrayOutputStream.toByteArray();
}
public static String decompress(byte[] contentBytes){
String sReturn="";
ByteArrayOutputStream out = new ByteArrayOutputStream();
try{
GZIPInputStream gzipInputStream =new GZIPInputStream(new ByteArrayInputStream(contentBytes));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int value = 0; value != -1;) {
value = gzipInputStream.read();
if (value != -1) {
baos.write(value);
}
}
gzipInputStream.close();
baos.close();
sReturn=new String(baos.toByteArray(), "UTF-16");
return sReturn;
// Ende Neu
} catch(IOException e){
throw new RuntimeException(e);
}
}
}
2 ответа
Я подозреваю, что это просто консоль, которая имеет проблемы. Я попробовал приведенный выше код, и хотя он не распечатал ни один из символов должным образом, когда я тестировал циклическое отключение строки, все было хорошо:
System.out.println(sDecompressed.equals(sTestString)); // Prints true
Что это делает на вашей машине?
Отображение не ASCII-символа на консольном выводе не так просто. Предполагая, что вы используете Windows в качестве операционной системы (поскольку командная строка не поддерживает Unicode по умолчанию), вы можете изменить номер активной кодовой страницы (используя chcp
команда). Я не знаю, как это делается с помощью кода, но я предлагаю запустить код в командной строке.
Это значение chcp 65001
Изменения для указания Windows использовать UTF-8 на своей консоли (вы можете посмотреть обсуждение здесь).
Надеюсь, это поможет.