Encoding UTF-8现在是非ASCII字符QR码的首选编码吗?

Encoding UTF-8现在是非ASCII字符QR码的首选编码吗?,encoding,utf-8,character-encoding,qr-code,iso-8859-1,Encoding,Utf 8,Character Encoding,Qr Code,Iso 8859 1,谷歌使用UTF-8IT作为他们非常流行的编码器的默认值。据我所见,它们甚至没有添加字节顺序标记 问题是,大多数扫描仪似乎仍然使用JIS8(QR 2000)而不是iso-8859(QR 2005)作为默认值,因此使用iso-8859进行编码基本不起作用 看起来utf-8是唯一的选择,即使它违反了规范 编辑:我将使用utf-8,没有ECI和BOM。违反所有规范和精神,但目前效果最好。规范规定ISO-8859-1是字节模式编码的默认值。然而在实践中,是的,你会在日本看到很多Shift-JIS,或者UT

谷歌使用UTF-8IT作为他们非常流行的编码器的默认值。据我所见,它们甚至没有添加字节顺序标记

问题是,大多数扫描仪似乎仍然使用JIS8(QR 2000)而不是iso-8859(QR 2005)作为默认值,因此使用iso-8859进行编码基本不起作用

看起来utf-8是唯一的选择,即使它违反了规范


编辑:我将使用utf-8,没有ECI和BOM。违反所有规范和精神,但目前效果最好。

规范规定ISO-8859-1是字节模式编码的默认值。然而在实践中,是的,你会在日本看到很多Shift-JIS,或者UTF-8

UTF-8是正确的选择。要正确地执行此操作,您需要在流中添加一些指示,表明它是UTF-8。规范确实允许这样做。您需要在字节段前面加一个表示UTF-8的字符

如果您向zxing编码器发送编码为UTF-8的提示,则zxing编码器将为您执行此操作。

BOM没有帮助 我的经验表明,BOM没有帮助。如果QR扫描仪无法显示正确编码的UTF-8字符串(数据流中的8位字节模式)中的字符串,即使使用ECI,添加BOM也没有任何区别

即使在正确编码的UTF-8上,扫描仪也会失败 以无法显示正确UTF-8字符串的扫描仪为例,以使用MIUI Global v11.0.3的小米手机为例(使用其本机扫描仪应用程序)。即使ECI中指定了此字符集,这些手机也无法正确显示UTF-8编码的西里尔字母字符串。西里尔文字显示为问号。但如果您添加了中文/日文字符(例如。日) 对于西里尔文字,小米将正确显示整个文字。这与BOM无关

这些是真正重要的字符,而不是编码 您认为在二维码中使用UTF-8而不是ISO-8859-1更好,因为ISO-8859-1不是2000年发布的早期二维码标准(ISO/IEC 18004:2000)中的默认编码。该标准确实根据JIS X 0201(JIS8也称为ISO-2022-JP)指定了8位拉丁/假名字符集作为8位模式的默认编码,而2005年发布的更新标准确实将默认值更改为ISO-8859-1。因此,您认为“使用ISO-8859进行编码基本上不起作用”。 这取决于US-ASCII字符是否足够(具体而言,可打印的ANSI X3.4-1986字符的范围为
20
-
7E
),并且您不需要ISO-8859-1字符以及加泰罗尼亚语、法语、加利西亚语、德语、欧西坦语和西班牙语等语言中使用的umlaut/diaeresis

如果您只需要US-ASCII,那么使用不带任何ECI的ISO-8859-1是安全的,而使用带ECI的UTF-8是安全的。无论如何,
20
-
7E
范围内的US-ASCII字符的八位字符串将是相同的,无论它编码为ISO-8859-1还是UTF-8。扫描仪使用的启发式软件应该能够自动计算出如果您仅使用US-ASCII字符,则使用字符集。如果您需要使用umlaut/diaeresis字符,则使用UTF-8。这不是因为QR码标准的2000至2005版本之间默认编码已从JIS X 0201更改为ISO-8859-1,而是因为QR扫描仪使用试探法自动检测编码ng,这种启发式在某些情况下失败

为什么QR扫描仪使用启发式检测编码 如您所知,QR码中有4种文本存储模式:(1)数字,(2)字母数字,(3)8位和(4)汉字

因此,QR码标准本身并不支持UTF-8。要在8位字符串中使用UTF-8编码(而不是默认的“ISO-8859-1”或“JIS8”),实现必须插入ECI(扩展通道解释)在此之前,字符串。ECI是QR码的可选附加功能,但至少在2000年最早的QR码标准中定义了它。ECI使用默认字符集以外的字符集启用数据编码。它还启用其他数据解释(例如,使用定义的压缩方案压缩数据)或其他需要编码的行业特定要求

ECI协议在AIM,Inc.制定的规范中定义,不免费提供,但可在以下地点以50美元购买:

扫描仪可能会忽略ECI协议 不幸的是,并非所有QR扫描仪都能处理ECI协议,即使在将默认编码更改为UTF-8这样的基本情况下也是如此。大多数实现都使用启发式算法,即一种或另一种字符编码检测算法来猜测编码,即使编码在解码QR码的ECI中明确指定。他们使用heuristics不仅仅是由于2000年至2005年间默认编码从JIS8更改为ISO-8859-1。主要原因是缺乏适当的ECI协议支持,可能是因为QR代码规范和AIM ECI协议规范是不同的文档。一些QR编码器不通过ECI指定字符编码,而是使用di8位字符串的不同编码(JIS8、Shift_JIS、ISO-8859-1、UTF-8),因此扫描仪必须处理这一问题

您写道“似乎utf-8是唯一的选择”,但扫描仪使用的试探法可能会失败,即使使用utf-8,正如我给出的小米示例中所示。您还写道utf-8“违反规范”,但只有在未通过ECI明确指定utf-8编码的情况下才会如此

ECI和UTF-8的替代品,但不是完全治愈 另外,使用ECI还有一种替代方法。您可以使用“汉字”模式使用umlaut/diaeresis或西里尔字母对拉丁字符进行编码。在这种模式下,“Shift_JIS”用于对范围
8140
-
9FFC
E040
-
EBBF
中的JIS X 0208字符进行编码。此处不能对其他范围中的字符进行编码