Skip to content

Kanji Mode QR code is broken #172

@askdkc

Description

@askdkc

Although a recent pull request (#170) fixed encoding errors for Shift-JIS, generating QR codes in Kanji mode still presents issues with readability. For instance, attempting to generate a QR code using only Kanji characters results in an unreadable code.

For Kanji Mode example:

use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;

$renderer = new ImageRenderer(
  new RendererStyle(400),
  new ImagickImageBackEnd()
);
$writer = new Writer($renderer);
$writer->writeFile("あいうえお", "qrcode-alphanum.png", "SHIFT-JIS"); // Kanji Mode is used

Generated QR code (unreadable)

qrcode-kanjimode

However, by including alphanumeric characters and switching to Byte mode, a readable QR code can be generated.

For Byte Mode example:

use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;

$renderer = new ImageRenderer(
  new RendererStyle(400),
  new ImagickImageBackEnd()
);
$writer = new Writer($renderer);
$writer->writeFile("あいうえお123", "qrcode-alphanum.png", "SHIFT-JIS"); // Byte Mode is used

Generated QR code (readable)

qrcode-bytemode

How to fix:

I think we should just simply use Byte Mode to generate Shift-JIS encoded QR Code by changing this code:

if (null !== $encoding && 0 === strcasecmp($encoding, 'SHIFT-JIS')) {
return self::isOnlyDoubleByteKanji($content) ? Mode::KANJI() : Mode::BYTE();
}

to this:

if (null !== $encoding && 0 === strcasecmp($encoding, 'SHIFT-JIS')) {
    return Mode::BYTE();
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions