Description
Question
When generating a QR code with QRCodeGenerator.CreateQrCode
, what is the purpose of forceUtf8
versus eciMode: EciMode.Utf8
?
I would expect that specifying EciMode.Utf8
would force the generated code to use the UTF-8 character set when encoding the data. But in fact, it does so only when either (a) there are non-ISO-8859-1 characters present, or (b) forceUtf8
is true
.
Consider the following:
// produces an unreadable code:
var qrData = new QRCodeGenerator().CreateQrCode("https://en.wikipedia.org/wiki/È", ECCLevel.L, eciMode: EciMode.Utf8);
// works fine:
var qrData = new QRCodeGenerator().CreateQrCode("https://en.wikipedia.org/wiki/È", ECCLevel.L, forceUtf8: true, eciMode: EciMode.Utf8);
// whereas this produces identical QR codes:
var qrData = new QRCodeGenerator().CreateQrCode("https://en.wikipedia.org/wiki/🍕", ECCLevel.L, eciMode: EciMode.Utf8);
var qrData = new QRCodeGenerator().CreateQrCode("https://en.wikipedia.org/wiki/🍕", ECCLevel.L, forceUtf8: true, eciMode: EciMode.Utf8);
A similar phenomenon occurs when specifying EciMode.Iso8859_2
with specific strings -- interestingly, forceUtf8
must be true
for the code to function correctly.
If we assume that this is a bug, and EciMode.Utf8
should always encode with UTF-8, then what is the purpose for the forceUtf8
argument? My best guess is that it is some compatibility mode to use UTF-8 encoding when encoded with EciMode.Default
(which normally encodes as ISO-8859-1).
Suggestion
I suggest that:
- When specifying a
EciMode
besidesEciMode.Default
, the text is always encoded in the specified encoding. - For
EciMode.Default
withforceUtf8 == false
, it uses ISO-8859-1 (per spec,EciMode.Iso8859_1
is default) - For
EciMode.Default
withforceUtf8 == true
, it uses UTF-8 (against spec)
Spec
From ISO spec page 20:
The default interpretation for QR Code is ECI 000003 representing the ISO/IEC 8859-1 character set.