在QR码符号中编码UTF-8字符

时间:2015-06-29 12:37:40

标签: ios character-encoding qr-code core-image

从iOS 7开始,可以通过核心图像框架的CIFilter NSISOLatin1StringEncoding生成QR码。

通过查看文档,Apple表示用于生成QR Code的字符串必须使用NSUTF8StringEncoding进行编码。

  

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

但是,我尝试使用NSUTF8StringEncoding对中文字符进行编码,效果非常好。您认为我使用Sensors > Telemetry > Computer in the pit > via GET to a php interface > MySQL Database > Frontend webpage using php and ajax (every second)会遇到问题吗?有没有已知的问题?

2 个答案:

答案 0 :(得分:2)

以下是一般性建议,了解Core Image框架的人可能能够提供更具体的答案。尽管如此,我希望它澄清了为什么库提供了这样的特定编码建议,忽略该建议的可能后果,以及如何编码通过Latin-1无法获得的字符。

一般而言,QR码的ISO 18004:2006标准(“QR Code 2005”)及后来的标准规定,在解释QR码字节序列时应使用Latin-1字符编码,但扩展频道解释除外(在数据中提供了指定替代字符编码的ECI代码。

然而,用户使用UTF-8对数据进行编码是很常见的,实际上大多数条形码阅读器使用特定于产品的启发式来猜测是否根据Latin-1对任何特定内容进行编码或UTF-8。在某些情况下,这会导致模糊,并且会导致误读,尤其是在开放应用程序中使用任意数据时。

如果您打算对内容严格并且需要使用UTF-8对数据进行编码,那么最好先查看编码库是否支持在此类数据*之前设置ECI 000026。

以下文章进一步详述:

http://www.bardecode.com/en1/qr-codes-and-utf-8-encoding/

指定的ECI代码注册表可从AIM商店免费获得"ECI Part 3: Register"

[*]使用CIQRCodeGenerator时似乎并非如此。

答案 1 :(得分:1)

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

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

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

这就是NSISOLatin1StringEncoding用于CIQRCodeGenerator的原因–因为QR码中的默认编码是“ ISO-8859-1”,所以QR码中采用了8位文本编码模式。 / p>

要在8位字符串中使用UTF-8编码而不是默认的“ ISO-8859-1”,实现必须在字符串之前插入ECI(扩展通道解释)。

ECI是QR码的可选附加功能。 ECI启用使用默认字符集以外的字符集进行数据编码。它还可以对其他数据解释(例如使用定义的压缩方案的压缩数据)或其他特定于行业的要求进行编码。

ECI协议在AIM ECI规范(由AIM,Inc-20399 Route 19,Suite 203,Cranberry Township,Pennsylvania 16066 USA)中完全定义。它是与QR Code规范不同的规范。 ECI协议提供了一种在打印之前和解码之后指定字节值的特定解释的方法。该规范的价格为$ 50,价格为https://www.aimglobal.org/technical-symbology.html

不幸的是,即使将基本编码更改为UTF-8这样的基本操作,并非所有QR解码器实现都可以处理ECI协议。即使在已解码QR码的ECI中明确指定了编码,大多数实现仍使用一种或另一种字符编码检测算法来猜测编码。

使用检测算法的必要性确实是由于2000年发布的初始QR码标准(ISO / IEC 18004:2000)确实根据JIS X 0201(8位)指定了8位拉丁/假名字符集( JIS8(也称为ISO-2022-JP)是8位模式的默认编码,而2005年发布的更新标准的确将默认设置更改为ISO-8859-1。

例如,具有MIUI Global v11.0.3的小米手机无法正确显示以UTF-8编码的西里尔字母字符串,即使该编码是通过ECI指定的。西里尔字母显示为问号。但是,如果您在西里尔文字中添加中文/日语字符(例如日),则小米将正确显示整个文字。

应商定QR解码器的一组最佳实践。该集合应规定,如果给出ECI扩展名以指定字符编码,则不应使用任何字符编码检测算法来覆盖指定的编码。