从iOS 7开始,就可以通过名为CIQRCodeGenerator的核心图像框架生成QR代码。
通过查看文档,苹果表示用于生成QR代码的字符串必须用NSISOLatin1StringEncoding编码。
若要从字符串或URL创建QR代码,请使用NSData字符串编码将其转换为NSISOLatin1StringEncoding对象。
然而,我试着用NSUTF8StringEncoding对汉字进行编码,而且效果很好。你认为使用NSUTF8StringEncoding会有问题吗?有什么已知的问题吗?
发布于 2020-04-04 20:32:48
“ISO-8859-1”是QR码的默认编码。
在QR代码中有4种存储文本的模式:
这就是为什么NSISOLatin1StringEncoding用于CIQRCodeGenerator -以适应QR代码中的8位文本编码模式,因为“ISO-8859-1”是QR代码中的默认编码。
若要在8位字符串中使用UTF-8编码而不是默认的“ISO-8859-1”,则实现必须在字符串之前插入ECI (扩展通道解释)。
ECI是QR代码的一个可选的附加功能。ECI使用默认字符集以外的字符集启用数据编码。它还允许对其他数据解释(例如使用定义的压缩方案的压缩数据)或其他特定行业的需求进行编码。
ECI协议完全定义在AIM规范中(由AIM,Inc - 20399路19,Suite 203,Cranberry镇,宾夕法尼亚16066美国)开发)。这是一个不同于QR规范的规范。ECI协议提供了一种方法,用于在打印和解码之前指定字节值的特定解释。该规范在https://www.aimglobal.org/technical-symbology.html售价为50美元。
不幸的是,并不是所有的QR解码器实现都能处理ECI协议,即使在将默认编码更改为UTF-8这样的基本情况下也是如此。大多数实现使用一个或另一个字符编码检测算法来猜测编码,即使编码是在解码的QR代码的ECI中显式指定的。
之所以需要使用检测算法,可能是因为2000年发布的初始QR代码标准(ISO/IEC 18004: 2000 )确实将按照JIS 0201 (JIS8又称为ISO-2022-JP)的8位拉丁/Kana字符集指定为8位模式的默认编码,而2005年发布的更新标准确实将默认编码更改为ISO-8859-1。
例如,带有MIUI Globalv11.0.3的小米手机无法正确显示以UTF-8编码的西里尔字符串,即使这种编码是通过ECI指定的。西里尔字母显示为问号。但是,如果你添加了一个汉字/日语字符(例如:(日)对于西里尔文本,小米将正确显示整个文本。
应商定一套QR解码器的最佳做法。该集合应规定,如果给出ECI扩展来指定字符编码,则不应使用字符编码检测算法覆盖指定的编码。
https://stackoverflow.com/questions/31115932
复制相似问题