I'm trying to generate a data matrix from a zip string using Zxing in Java and the result is java.lang.IllegalArgumentException: Message contains characters outside ISO-8859-1 encoding.
The code is:
byte[] bytesOfZIP= (byte[])statD.returnObj; // here is the zipped content
String texto = new String(bytesOfZIP, "UTF8");
DataMatrixWriter barcodeWriter = new DataMatrixWriter();
BitMatrix bitMatrix = barcodeWriter.encode(texto, BarcodeFormat.DATA_MATRIX, 400, 400);// exception appears at this line
BufferedImage bi = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);
byte[] fbytes = baos.toByteArray();
I'm looking for any solution to encode a ZIP file with these special chars not necessarily with Zxing.
CodePudding user response:
Not an answer
There are some problems, hence in answer form.
byte[] bytesOfZIP = (byte[])statD.returnObj; // here is the zipped content
An Object
(or char[]
, or String
) cannot be case to a byte[]
array.
String texto = new String(bytesOfZIP, "UTF8");
This will compile but the official name is "UTF-8"
and as already mentioned, StandardCharsets.UTF_8
would be nicer (no UnsupportedEncodingException
as UTF-8m is standard, always available). However bytesOfZIP
are never UTF-8 text, which requires a special format. In fact binary data should never be pressed in String with 2 byte chars. It requires twice a conversion to Unicode, double memory, and is almost certain to be corrupted.
DataMatrixWriter barcodeWriter = new DataMatrixWriter();
BitMatrix bitMatrix = barcodeWriter.encode(texto, BarcodeFormat.DATA_MATRIX, 400, 400);
BufferedImage bi = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);
byte[] fbytes = baos.toByteArray();
JPEG (.jpg, .jpeg) is a lossy compression. For a black-and-white barcode try use png.
Solution
Unzipping should first check the format: a test.txt.gz
would use a GZipInputStream
. A test.zip
a ZipFile, a ZipInputStream, or copying from zip file system. These are standard classes to be found in the internet.
As the contents are probably pure text, you can first try it hard-coded after manually unzipping.
If you start with a byte[]
then the matrix printer probably requires MS Latin 1, or Charset.fromName("Windows-1252")
. Latin-1, ISO-8859-1 or StandardCharsets.ISO_8859_1
has a forbidden control range from \u0080 - \u00BF
.
CodePudding user response:
You should try to replace "UTF8" with "StandardCharsets.UTF_8". Because I don't think "UTF8" is the correct way to set the charset of the string.