- - PR -
QRコードクラスライブラリで生成したコード読込むと日本語が文字化けする。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ] |
|
投稿日時: 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"); で良いのではないでしょうか。 |
|
投稿日時: 2008-06-16 16:10
ご返答ありがとうございます。
request.setCharacterEncoding()の追加 getBytes("Shift_JIS") で上手くいきました。 勉強になりしまた。 どうもありがとうございました。 |
1