如何在使用Zxing项目创建QR码时,使用UTF-8编码字符?

17

Zxing项目是一个著名的开源、多格式1D/2D条形码图像处理库,使用Java实现,并具备其他语言的端口。但我相信有一些人和我遇到了同样的问题:我无法在QR码中编码UTF-8字符。

如何使用Zxing项目在QR码中编码UTF-8字符?


1
请将此更改为一个问题,最好是更准确的技术问题(不存在“UTF-8字符”,而存在“字符,然后编码为UTF-8以获得二进制表示”)。 然后回答自己的问题。 目前,这个“问题”不适合该网站。 - Jon Skeet
精彩,思路清晰,见解深刻,经过深入研究的答案。问题是什么? - Walter K
抱歉,这不是一个问题,我只是想分享如何解决这个问题给其他人...我应该怎么做才合适? - Coding minion
@Bluegray - 编辑你的问题,使其成为一个问题。例如,“如何在使用Zxing项目生成QR码时使用UTF-8编码字符?”接下来,在下面添加你如何做到这一点的描述作为答案。这样可以让人们评论和投票你的答案,并且如果他们知道更好/不同的方法来做到这一点,也可以添加自己的答案。我可以为你做到这一点,但答案将以我的名字呈现,我不想占用你的声望分数! - David Webb
@DaveWebb:非常感谢,我会修改我的问题。 - Coding minion
问题是在扫描时是否有UTF-8编码的字符串,还是将Unicode字符放入QR中? - Thorbjørn Ravn Andersen
3个回答

23

正确的做法是使用提示:

  Hashtable hints = new Hashtable();
  hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

然后在QRCodeWriter类中调用这个版本的encode方法:

  encode(String contents, BarcodeFormat format, int width, int height,Hashtable hints)

我使用了Zxing项目的Core.jar,并正确使用了你提供的代码。虽然可以生成二维码,但如果我使用“Qr Droid”或“QuickMark”应用程序来解码此二维码,它无法被解码。无论如何,感谢你的帮助和答复。 :) - Coding minion
这是因为这些应用程序没有使用UTF-8解码的提示,所以这是预期的行为。如果您正在编写解码应用程序,可以将所需字符集与DecodeHintType.CHARACTER_SET作为键放入提示的哈希表中,并将其传递给MultiFormatReader - Mister Smith

9

史密斯先生的解答是正确的。但有些情况下你需要使用小写的 utf-8 而不是大写的 UTF-8 来与 ZXing 进行编码。否则一些扫描器如支付宝将无法读取。

Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");

这非常令人惊讶!你有任何想法为什么会发生这种情况吗? - LionGod8

1

我发现有一个更简单的API:

.withCharset("utf-8")

例子:

Bitmap bitmap = QRCode.from([string])
                   .withSize([width], [height])
                   .withCharset("utf-8")
                   .bitmap();

我看到了 QRCode 但是没有看到 from() 方法,你从哪里得到的? - Sam Chen
似乎是 QR 的高级 API,而不是 XZing。 - eckes
@SamChen 它是 com.github.kenglxn.QRGen。 - imworse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接