从 Java 中的 ZIP 字符串生成数据矩阵
Generating data matrix from a ZIP string in Java
我正在尝试在 Java 中使用 Zxing 从 zip 字符串生成数据矩阵,结果是 java.lang.IllegalArgumentException:消息包含 ISO-8859-1 编码之外的字符。
密码是:
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();
我正在寻找任何解决方案来使用这些特殊字符对 ZIP 文件进行编码,而 Zxing 不一定。
您应该尝试用“StandardCharsets.UTF_8”替换“UTF8”。因为我认为“UTF8”不是设置字符串字符集的正确方法。
没有答案
有一些问题,因此以答案形式。
byte[] bytesOfZIP = (byte[])statD.returnObj; // here is the zipped content
Object
(或char[]
,或String
)不能大小写为byte[]
数组。
String texto = new String(bytesOfZIP, "UTF8");
这将编译,但官方名称是 "UTF-8"
并且如前所述,StandardCharsets.UTF_8
会更好(没有 UnsupportedEncodingException
因为 UTF-8m 是标准的,始终可用)。但是 bytesOfZIP
从来都不是 UTF-8 文本,它需要一种特殊的格式。事实上,二进制数据不应该被压入带有 2 字节字符的字符串中。它需要两次转换为 Unicode,双倍内存,并且几乎肯定会损坏。
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)是一种有损压缩。对于黑白条形码尝试使用 png。
解决方案
解压首先要检查格式:test.txt.gz
会使用GZipInputStream
。 test.zip
ZipFile、ZipInputStream 或从 zip 文件系统复制。这些是可在互联网上找到的标准 类。
由于内容可能是纯文本,您可以先手动解压后硬编码试试
如果您以 byte[]
开头,则矩阵打印机可能需要 MS Latin 1 或 Charset.fromName("Windows-1252")
。 Latin-1、ISO-8859-1 或 StandardCharsets.ISO_8859_1
的禁止控制范围为 \u0080 - \u00BF
.
我正在尝试在 Java 中使用 Zxing 从 zip 字符串生成数据矩阵,结果是 java.lang.IllegalArgumentException:消息包含 ISO-8859-1 编码之外的字符。
密码是:
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();
我正在寻找任何解决方案来使用这些特殊字符对 ZIP 文件进行编码,而 Zxing 不一定。
您应该尝试用“StandardCharsets.UTF_8”替换“UTF8”。因为我认为“UTF8”不是设置字符串字符集的正确方法。
没有答案
有一些问题,因此以答案形式。
byte[] bytesOfZIP = (byte[])statD.returnObj; // here is the zipped content
Object
(或char[]
,或String
)不能大小写为byte[]
数组。
String texto = new String(bytesOfZIP, "UTF8");
这将编译,但官方名称是 "UTF-8"
并且如前所述,StandardCharsets.UTF_8
会更好(没有 UnsupportedEncodingException
因为 UTF-8m 是标准的,始终可用)。但是 bytesOfZIP
从来都不是 UTF-8 文本,它需要一种特殊的格式。事实上,二进制数据不应该被压入带有 2 字节字符的字符串中。它需要两次转换为 Unicode,双倍内存,并且几乎肯定会损坏。
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)是一种有损压缩。对于黑白条形码尝试使用 png。
解决方案
解压首先要检查格式:test.txt.gz
会使用GZipInputStream
。 test.zip
ZipFile、ZipInputStream 或从 zip 文件系统复制。这些是可在互联网上找到的标准 类。
由于内容可能是纯文本,您可以先手动解压后硬编码试试
如果您以 byte[]
开头,则矩阵打印机可能需要 MS Latin 1 或 Charset.fromName("Windows-1252")
。 Latin-1、ISO-8859-1 或 StandardCharsets.ISO_8859_1
的禁止控制范围为 \u0080 - \u00BF
.