Te sugerimos que pruebes esta solución en un ambiente controlado antes de pasarlo a producción, saludos.
Solución:
Entonces, como referencia futura para cualquiera que no quiera pasar dos días buscando en Internet para resolver esto, cuando codifique matrices de bytes en códigos QR, debe usar el ISO-8859-1
juego de caracteres, no UTF-8
.
este es mi código Java de ejemplo de trabajo para codificar código QR usando ZXing con codificación UTF-8, tenga en cuenta: deberá cambiar la ruta y los datos utf8 a su ruta y caracteres de idioma
package com.mypackage.qr;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.Hashtable;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.*;
public class CreateQR
public static void main(String[] args)
Charset charset = Charset.forName("UTF-8");
CharsetEncoder encoder = charset.newEncoder();
byte[] b = null;
try
// Convert a string to UTF-8 bytes in a ByteBuffer
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("utf 8 characters - i used hebrew, but you should write some of your own language characters"));
b = bbuf.array();
catch (CharacterCodingException e)
System.out.println(e.getMessage());
String data;
try
data = new String(b, "UTF-8");
// get a byte matrix for the data
BitMatrix matrix = null;
int h = 100;
int w = 100;
com.google.zxing.Writer writer = new MultiFormatWriter();
try
Hashtable hints = new Hashtable(2);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
matrix = writer.encode(data,
com.google.zxing.BarcodeFormat.QR_CODE, w, h, hints);
catch (com.google.zxing.WriterException e)
System.out.println(e.getMessage());
// change this path to match yours (this is my mac home folder, you can use: c:\qr_png.png if you are on windows)
String filePath = "/Users/shaybc/Desktop/OutlookQR/qr_png.png";
File file = new File(filePath);
try
MatrixToImageWriter.writeToFile(matrix, "PNG", file);
System.out.println("printing to " + file.getAbsolutePath());
catch (IOException e)
System.out.println(e.getMessage());
catch (UnsupportedEncodingException e)
System.out.println(e.getMessage());
Por lo que vale, mi pico maravilloso parece funcionar con codificaciones de caracteres UTF-8 e ISO-8859-1. Sin embargo, no estoy seguro de lo que sucederá cuando un decodificador que no sea zxing intente decodificar la imagen codificada en UTF-8 … probablemente varía según el dispositivo.
// ------------------------------------------------------------------------------------
// Requires: groovy-1.7.6, jdk1.6.0_03, ./lib with zxing core-1.7.jar, javase-1.7.jar
// Javadocs: http://zxing.org/w/docs/javadoc/overview-summary.html
// Run with: groovy -cp "./lib/*" zxing.groovy
// ------------------------------------------------------------------------------------
import com.google.zxing.*
import com.google.zxing.common.*
import com.google.zxing.client.j2se.*
import java.awt.image.BufferedImage
import javax.imageio.ImageIO
def class zxing
def static main(def args)
def filename = "./qrcode.png"
def data = "This is a test to see if I can encode and decode this data..."
def charset = "UTF-8" //"ISO-8859-1"
def hints = new Hashtable([(EncodeHintType.CHARACTER_SET): charset])
writeQrCode(filename, data, charset, hints, 100, 100)
assert data == readQrCode(filename, charset, hints)
def static writeQrCode(def filename, def data, def charset, def hints, def width, def height)
BitMatrix matrix = new MultiFormatWriter().encode(new String(data.getBytes(charset), charset), BarcodeFormat.QR_CODE, width, height, hints)
MatrixToImageWriter.writeToFile(matrix, filename.substring(filename.lastIndexOf('.')+1), new File(filename))
def static readQrCode(def filename, def charset, def hints)
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(ImageIO.read(new FileInputStream(filename)))))
Result result = new MultiFormatReader().decode(binaryBitmap, hints)
result.getText()
Reseñas y calificaciones
Si aceptas, tienes la habilidad dejar un tutorial acerca de qué le añadirías a este artículo.