用ZXing.NET对中文字符串编码

转自:http://blog.sina.com.cn/s/blog_4513dde60102vn2h.html


用ZXing.NET对中文字符串编码

  (2015-07-07 12:33:53)
转载
标签: 

matlab

 

中文编码

 

qrcode

分类: 计算机与 Internet
    之前在 《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,  400400, hints) ;
m = char(mtx.ToString()) ;
m(m == 13) =  [] ;
m(m == 10) =  [] ;
m = m( 1: 2: end) ;
m =  reshape(m,  400400) ;
m(m ~= 'X') =  1 ;
m(m == 'X') =  0 ;
m = double(m) ' ;
imshow(m) ;

与之前的代码相比,最主要的修改是使用了5参数的encode方法。这里可以用
methodsview(writer)
的方式查看MultiFormatWriter有哪些方法,各个方法的参数是什么。encode的参数如下所示:
用ZXing.NET对中文字符串编码_第1张图片

相比四参数的encode,五参数的encode可以通过额外的参数来指定编码。这个额外的参数可以使用System.Collections.Generic.Dictionary类型,这是一个泛型类,在Matlab中可以用NET.createGeneric来构造实例。实例可以通过Add方法添加key-value对。上面的代码中我们添加的是
ZXing.EncodeHintType.CHARACTER_SET,  'utf-8'
将构造好的Dictionary实例作为第五个参数传给encode,就能解决中文编码的问题。生成的二维码如下图所示:
用ZXing.NET对中文字符串编码_第2张图片

用Barcode Scanner扫描的结果如下图所示:
用ZXing.NET对中文字符串编码_第3张图片

中文不再是乱码了。

你可能感兴趣的:(二维码)