- PR -

QRコードクラスライブラリで生成したコード読込むと日本語が文字化けする。

1
投稿者投稿内容
ikp
会議室デビュー日: 2008/06/16
投稿数: 2
投稿日時: 2008-06-16 14:57
投稿させていただきます。

QRコードクラスライブラリを使用して開発をしているのですが
生成されたQRコードを携帯で読取ると日本語だけが文字化けをしてしまいます。
コード化する文字はURLエンコードしているのですが、UTF-8,EUC-JP,JIS,SJISを
試しましたが全て駄目でした。
以下にソースコードを添付いたしますので、どこかおかしいところがあれば
ご教授お願いします。

コード: -----------------------------------------------------------------------
package aa;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.swetake.util.Qrcode;

public final class GetQrcode extends HttpServlet implements SingleThreadModel {
public static final String
QR_DATA = "qr_data";
private static final String
CONTENT_TYPE_PNG = "image/png";
public void doGet(HttpServletRequest request, HttpServletResponse response) {
try {
ServletOutputStream out = response.getOutputStream();
response.setContentType(CONTENT_TYPE_PNG);
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
String qr_data = request.getParameter(QR_DATA);
if (qr_data == null || qr_data.length() == 0) {
return;
}
synchronized (qr_data) {
BufferedImage im = new BufferedImage(135,135, BufferedImage.TYPE_INT_RGB);
Graphics gs = im.createGraphics();
Qrcode x = new Qrcode();
x.setQrcodeErrorCorrect('M');
x.setQrcodeEncodeMode('B');
x.setQrcodeVersion(7);
byte[] d = qr_data.getBytes();
if (d.length > 0 && d.length < 120) {
boolean[][] s = x.calQrcode(d);
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s.length; j++) {
if (!s[j][i]) {
gs.fillRect(j * 3, i * 3, 3, 3);
}
}
}
}
gs.drawImage(im, 0, 0, null);
gs.dispose();
ImageIO.write(im, "png", out);
}
} catch (IOException ioex) {
ioex.printStackTrace();
}
}

public final void doPost(HttpServletRequest req, HttpServletResponse res) {
doGet(req, res);
}

public void doPut(HttpServletRequest req, HttpServletResponse res) {
}

public void destroy() {
}
}


[ メッセージ編集済み 編集者: ikp 編集日時 2008-07-09 17:02 ]
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-06-16 15:28
このQRコードライブラリは使ったことありませんが、典型的なサーブレットのエンコーディング問題のように見えます。

> String qr_data = request.getParameter(QR_DATA);
QR_DATAパラメータがどういうエンコーディングなのか指定していないため、qr_dataに入るべきUnicode文字が化けます。これを呼ぶ前に request.setCharacterEncoding()を呼ぶ必要がありそうです。

qr_dataに正しいUnicode文字が入っているとして、
> byte[] d = qr_data.getBytes();
ここでエンコーディングを指定していないので、dに入るバイト列がどうエンコードされるかプラットフォーム依存になります。QRコードはShift_JISだそうなので、getBytes("Shift_JIS"); で良いのではないでしょうか。
ikp
会議室デビュー日: 2008/06/16
投稿数: 2
投稿日時: 2008-06-16 16:10
ご返答ありがとうございます。
request.setCharacterEncoding()の追加
getBytes("Shift_JIS")
で上手くいきました。
勉強になりしまた。
どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)