之前在
《Matlab调用ZXing的详细步骤——二维码生成》中,给出了在Matlab中调用ZXing.NET生成QR码的具体步骤。尽管步骤非常具体,但是遗留了一个我认为不是很重要的问题,就是中文的编码。之所以认为不重要是因为我用QR码主要是生成URL。
但是不管怎么样中文编码的问题如果能够解决就再好不过了。我今天在网上搜了一下,很多解决方法都需要修改ZXing的源码。可是我写
《Matlab调用ZXing的详细步骤——二维码生成》就是为了帮助不会编译代码的小伙伴使用ZXing,因为ZXing.NET提供了编译好的dll。如果要改源码的话,还是绕不过编译。
后来我在Stackoverflow上找到了Java的解决办法,见
http://stackoverflow.com/questions/8859268/how-to-encode-a-string-in-a-qr-code-using-zxing-on-android。原版的(Java)ZXing和ZXing.NET用起来还是差不多的,即使是Java的解决方法也可用于ZXing.NET。Matlab代码如下:
zxingasm
=
NET.addAssembly(
'C:\lab\zxing\zxing.dll')
;
writer
=
ZXing.MultiFormatWriter()
;
hints
=
NET.createGeneric(
'System.Collections.Generic.Dictionary',
{
'ZXing.EncodeHintType',
'System.Object'})
;
hints.Add(ZXing.EncodeHintType.CHARACTER_SET,
'utf-8')
mtx
=
writer.encode(
'测试中文编码',
ZXing.BarcodeFormat.QR_CODE,
400,
400,
hints)
;
m
=
char(mtx.ToString())
;
m(m
==
13)
=
[]
;
m(m
==
10)
=
[]
;
m
=
m(
1:
2:
end)
;
m
=
reshape(m,
400,
400)
;
m(m
~=
'X')
=
1
;
m(m
==
'X')
=
0
;
m
=
double(m)
'
;
imshow(m)
;
与之前的代码相比,最主要的修改是使用了5参数的encode方法。这里可以用
methodsview(writer)
的方式查看MultiFormatWriter有哪些方法,各个方法的参数是什么。encode的参数如下所示:
相比四参数的encode,五参数的encode可以通过额外的参数来指定编码。这个额外的参数可以使用System.Collections.Generic.Dictionary类型,这是一个泛型类,在Matlab中可以用NET.createGeneric来构造实例。实例可以通过Add方法添加key-value对。上面的代码中我们添加的是
ZXing.EncodeHintType.CHARACTER_SET,
'utf-8'
将构造好的Dictionary实例作为第五个参数传给encode,就能解决中文编码的问题。生成的二维码如下图所示:
用Barcode Scanner扫描的结果如下图所示:
中文不再是乱码了。