Saltar al contenido

Codificación y decodificación de códigos QR usando zxing

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-1juego 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *