首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用QR码码编码UTF-8字符

用QR码码编码UTF-8字符
EN

Stack Overflow用户
提问于 2015-06-29 12:37:40
回答 1查看 6.6K关注 0票数 3

从iOS 7开始,就可以通过名为CIQRCodeGenerator的核心图像框架生成QR代码。

通过查看文档,苹果表示用于生成QR代码的字符串必须用NSISOLatin1StringEncoding编码。

若要从字符串或URL创建QR代码,请使用NSData字符串编码将其转换为NSISOLatin1StringEncoding对象。

然而,我试着用NSUTF8StringEncoding对汉字进行编码,而且效果很好。你认为使用NSUTF8StringEncoding会有问题吗?有什么已知的问题吗?

EN

回答 1

Stack Overflow用户

发布于 2020-04-04 20:32:48

“ISO-8859-1”是QR码的默认编码。

在QR代码中有4种存储文本的模式:

  • 数值(0-9);
  • 字母数字(数字加大写A-Z,空格和8个标点符号)-总共45个字符;
  • 8位(默认情况下,“ISO-8859-1”编码文本);
  • Kanji (“Shift_JIS”编码范围为8140-9FFC和E040-EBBF的JIS 0208个字符)。

这就是为什么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扩展来指定字符编码,则不应使用字符编码检测算法覆盖指定的编码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31115932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档