Každý generátor QR kódů pro vás ve výchozím nastavení vybere režim kódování a většinou je toto výchozí nastavení v pořádku. Přestane být v pořádku ve chvíli, kdy potřebujete nad ním mít kontrolu — číselné ID vedle kódu produktu, blok japonského textu, který nechcete uložit jako UTF‑8, nebo užitečná data, kde potřebujete pokaždé získat stejné bajty při generování. Tento průvodce ukazuje, jak explicitně nastavit režimy kódování QR kódu v Pythonu, pomocí Aspose.BarCode for Python via .NET, aby jeden QR symbol mohl nést číselný segment, alfanumerický segment, bajtový segment a kanji segment — každý uložený v režimu, který mu nejlépe vyhovuje.

Aspose.BarCode nazývá tyto compaction modes ve svých API názvech (QrExtCompactionMode) a samotná specifikace QR je nazývá encoding modes. Jedná se o stejné čtyři režimy pod dvěma názvy a tato příručka používá po celou dobu termín “encoding mode”, protože to je termín, který používá specifikace a většina knihoven QR pro Python.

Proč režimy kódování QR ovlivňují velikost symbolu a spolehlivost skenování

Fyzická velikost QR kódu je určována tím, kolik bitů potřebuje jeho náklad, a počet bitů na znak závisí výhradně na použitém režimu kódování pro daný segment. Specifikace definuje čtyři datové režimy s výrazně odlišnou hustotou:

RežimZnaková sadaÚložištěCena za znak
ČíselnýČíslice 0-93 číslice na 10 bitů3,33 bitu
AlfanumerickýČíslice, velká písmena A-Z, mezera, $%*+-./:2 znaky na 11 bitů5,5 bitu
BajtJakákoli 8‑bitová data, typicky UTF‑81 bajt na 8 bitů8 bitů
KanjiDvojbajtové znaky Shift-JIS1 znak na 13 bitů13 bitů

30místný identifikátor stojí přibližně 100 bitů v číselném režimu a 240 bitů v bajtovém režimu. Tento rozdíl je často dostatečný k tomu, aby posunul symbol o několik QR verzí výš, a vyšší verze znamená více modulů ve stejné tištěné oblasti — menší moduly a nižší čitelnost na nízkorozlišovacích kamerách, zakřiveném balení a opotřebovaných štítcích.

Automatický výběr režimu dobře zvládá většinu datových paketů. Stává se však omezeným, když znáte strukturu svých dat a analyzátor ne: dlouhý číselný řetězec přerušený jedním písmenem, japonský text, na který by režim byte spotřeboval tři bajty UTF‑8 na znak, nebo identifikátor s pevně daným formátem, kde chcete deterministický výstup napříč verzemi knihovny.

Když má smysl nastavit režim ručně

Přepínání režimu není zdarma. Každá hranice segmentu zapisuje čtyřbitový indikátor režimu plus pole počtu znaků o délce osm až šestnáct bitů v závislosti na verzi QR. Přehnané segmentování nákladu může vytvořit větší symbol, než kdyby se rozhodl generátor.

Explicitní nastavení režimu se vyplatí, když:

  • Payload obsahuje dlouhé, homogenní sekvence — 40místný sériový kód, odstavec kanji.
  • Kódujete japonský text a chcete režim Kanji s 13 bity na znak místo bajtového režimu s 24 bity.
  • Potřebujete reprodukovatelný, bajtově identický výstup pro regresní testy nebo validaci kontrolního součtu.

Obvykle se nevyplatí přidávat složitost pro krátké náklady, data, která se každých několik znaků mění typu, nebo URL, které automatická analýza již dobře zvládá. Pododdíl měření níže ukazuje, jak zjistit, ve kterém případě se nacházíte.

Dva způsoby, jak nastavit režimy kódování QR v Pythonu

Aspose.BarCode nabízí dvě cesty ke stejnému zakódovanému výsledku a stojí za to vědět, proč obě existují, než začnete psát kód.

QrExtCodetextBuilderInline rozšířené selektory
Režim nastavený pomocíVolání metod s hodnotami výčtuZnačky zpětného lomítka v řetězci
Zachycené chybyNa místě voláníPouze při dekódování
Problémy s escapovánímŽádné\\ escapování, nebo surové řetězce
Nejvhodnější proAplikační kódKódový text z konfigurace, databáze nebo jiného systému

Builder je lepší výchozí volba. QrExtCompactionMode.NUMERIC buď existuje, nebo okamžitě vyvolá AttributeError, zatímco špatně napsané \numm v řetězci tiše přejde na data užitečného zatížení a objeví se až při skenování štítku. Oba přístupy používají stejné nastavení generátoru QREncodeMode.EXTENDED, takže se mezi nimi můžete přepínat bez změny čehokoli v následném zpracování.

Nastavení režimů kódování QR kódu v Pythonu: krok za krokem

1. Instalace a příprava vývojového prostředí

Aspose.BarCode for Python via .NET je multiplatformní knihovna podporující generování, rozpoznávání a manipulaci s více než 50 symbologiemi, včetně QR. Instalujte z PyPI:

pip install aspose-barcode-for-python-via-net

Potvrďte verzi, protože tyto API vyžadují verzi 26.6 nebo novější:

pip show aspose-barcode

Pak ověřte, že import se vyřeší. Balíček se váže na runtime .NET, takže úspěšný import vám řekne více než jen přítomnost souborů na disku:

from aspose.barcode.generation import QREncodeMode, QrExtCompactionMode

print("Aspose.BarCode imported successfully.")
print("EXTENDED mode available:", hasattr(QREncodeMode, "EXTENDED"))
print("Encoding modes:", [m for m in dir(QrExtCompactionMode) if m.isupper()])

Output:

Aspose.BarCode imported successfully.
EXTENDED mode available: True
Encoding modes: ['ALPHA_NUMERIC', 'AUTO', 'BYTES', 'KANJI', 'NUMERIC']

Pokud chybí EXTENDED, používáte verzi starší než 26.6 a musíte ji před pokračováním aktualizovat.

Pokud máte soubor licence, použijte jej jednou při spuštění aplikace, před jakýmkoli voláním generování nebo rozpoznávání:

from aspose.barcode import License

license = License()
license.set_license("Aspose.BarCode.Python.NET.lic")

2. Nastavte režim kódování pro každý segment pomocí QrExtCodetextBuilder

QrExtCodetextBuilder obsahuje uspořádaný seznam segmentů. Každé volání připojí data spolu s režimem kódování, který by je měl uložit, a get_extended_codetext() je sestaví do rozšířeného formátu řetězce, který generátor rozumí.

  1. Importujte třídy pro generování.
  2. Vytvořte QrExtCodetextBuilder.
  3. Přidejte číselný segment pomocí QrExtCompactionMode.NUMERIC.
  4. Přidejte alfanumerický segment pomocí QrExtCompactionMode.ALPHA_NUMERIC.
  5. Přidejte bajtový segment pomocí QrExtCompactionMode.BYTES.
  6. Přidejte Kanji segment pomocí QrExtCompactionMode.KANJI.
  7. Získejte kombinovaný rozšířený kódový text.
from aspose.barcode.barcoderecognition import BarCodeReader, DecodeType
from aspose.barcode.generation import (
    BarcodeGenerator,
    EncodeTypes,
    QREncodeMode,
    QrExtCodetextBuilder,
    QrExtCompactionMode,
)

# Instantiate the Builder.
text_builder = QrExtCodetextBuilder()

# Numeric Segment — 3 Digits per 10 Bits.
text_builder.add_codetext_with_compaction_mode(
    QrExtCompactionMode.NUMERIC, "1234567"
)

# Alphanumeric Segment — Uppercase and Digits Only, 2 Characters per 11 Bits.
text_builder.add_codetext_with_compaction_mode(
    QrExtCompactionMode.ALPHA_NUMERIC, "ASPOSE2026"
)

# Byte Segment — Lowercase Forces Byte Mode, 8 Bits per Character.
text_builder.add_codetext_with_compaction_mode(
    QrExtCompactionMode.BYTES, "aspose2026"
)

# Kanji Segment — Shift-JIS Double-Byte Characters, 13 Bits Each.
text_builder.add_codetext_with_compaction_mode(
    QrExtCompactionMode.KANJI,
    "\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A",
)

# Assemble the Final Extended Codetext.
codetext = text_builder.get_extended_codetext()
print("Extended codetext:", repr(codetext))

Vysvětlení

  • Každé volání add_codetext_with_compaction_mode nastaví režim kódování pro jeden segment. Pořadí je důležité — dekodér vrací segmenty spojené v pořadí, ve kterém jste je přidali.
  • Alfanumerická sada je úmyslně úzká: číslice, velká písmena A‑Z, mezera a $%*+-./:. Proto ASPOSE2026 odpovídá alfanumerickému režimu, zatímco aspose2026 ne. Malá písmena nejsou v sadě, takže tento segment musí použít BYTES. Předání malých písmen do ALPHA_NUMERIC je nejčastější chyba při nastavování režimů tímto způsobem.
  • Kanji segment používá \u3062 a dál, což jsou hiragana, nikoli skutečné kanji. Kanji režim pokrývá dvojbytový rozsah Shift‑JIS, který zahrnuje kana, takže tyto znaky jsou kódovány 13 bity každý místo 24 bitů, které by byte režim spotřeboval na každý znak v UTF‑8.
  • get_extended_codetext() vytváří řetězec, který generátor parsuje v režimu EXTENDED. Vytištění pomocí repr() stojí za to udělat jednou — zobrazí vám syntaxi selektoru, kterou builder generuje, a to je přesně to, co následující pododdíl zapisuje ručně.

3. Nastavte režim kódování inline, bez builderu

Když kódový text pochází mimo váš Python kód, můžete nastavit režim každého segmentu přímo pomocí selektoru. Každý značkový znak s předponou zpětného lomítka řídí každý znak až do dalšího výskytu značky:

SelectorNastavuje režim na
\numČíselný
\alnumAlfanumerický
\byteBajt, UTF-8
\kanjiKanji, Shift-JIS
\autoAutomatický výběr režimu
# Equivalent to the Builder Output Above, Written Directly.
codetext = (
    r"\num1234567"
    r"\alnumASPOSE2026"
    r"\byteaspose2026"
    "\\kanji\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A"
)

Všimněte si únikových sekvencí. V normálním řetězci Pythonu je "\num" ne selektor — je to nový řádek následovaný um. Raw řetězce (r"...") tomuto problému předcházejí, ale raw řetězec také blokuje úniky \u, což je důvod, proč řádek s kanji výše používá konvenční řetězec s \\kanji. Tento únikový past je praktickým argumentem pro upřednostnění builderu v sekci 2.

4. Generování QR čárového kódu v režimu EXTENDED

Nastavení režimů na úrovni segmentu nemá žádný efekt, dokud není generátor instruován, aby je četl. Bez QREncodeMode.EXTENDED je informace o segmentu ignorována a značky selektoru jsou kódovány jako doslovný text užitečného zatížení.

  1. Vytvořte BarcodeGenerator s EncodeTypes.QR a rozšířeným textem kódu.
  2. Nastavte encode_mode na QREncodeMode.EXTENDED.
  3. Nakonfigurujte rozlišení a volitelně úroveň opravy chyb a okraj.
  4. Uložte čárový kód jako bezztrátový PNG.
# Create the QR Generator with the Extended Codetext.
gen = BarcodeGenerator(EncodeTypes.QR, codetext)

# Switch to EXTENDED Mode So the Per-Segment Modes Are Respected.
gen.parameters.barcode.qr.encode_mode = QREncodeMode.EXTENDED

# Render at Print Resolution Rather Than Upscaling Later.
gen.parameters.resolution = 300

# Save the Generated QR Code.
gen.save("extended_qr.png")

print("QR code generated and saved as extended_qr.png")

Vysvětlení

  • gen.parameters.barcode.qr.encode_mode = QREncodeMode.EXTENDED je řádek, který aktivuje segmentové parsování. Vynechte jej a generátor vytvoří platný, skenovatelný QR kód obsahující doslovný text \num1234567... — což je důvod, proč další pododdíl ověřuje místo toho, aby předpokládal.
  • gen.parameters.resolution = 300 vykresluje v tiskovém rozlišení. Symboly určené pro štítkové tiskárny nebo obalové grafiky by měly být generovány v konečné velikosti, neškálované později, což změkčuje hrany modulů.
  • save zapisuje bezztrátový PNG. Vyhněte se JPEG pro jakoukoli 2D symbologii — jeho kompresní artefakty rozmazávají mřížku modulů, kterou dekodér vzorkuje.

5. Ověřte, že byl aplikován režim kódování

Úspěšné vygenerování neprokazuje nic o tom, zda se režimy na úrovni segmentu uplatnily. Krok dekódování je tím, co odděluje správně zakódovaný symbol od toho, který nese selektorové značky jako data.

  1. Inicializujte BarCodeReader s cestou k souboru a DecodeType.QR.
  2. Materializujte výsledky, aby bylo neúspěšné čtení viditelné.
  3. Porovnejte dekódovaný text s očekávanou konkatenací.
EXPECTED = (
    "1234567"
    "ASPOSE2026"
    "aspose2026"
    "\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A"
)

# Initialise the QR Code Reader.
reader = BarCodeReader("extended_qr.png", DecodeType.QR)
results = list(reader.read_bar_codes())

if not results:
    raise ValueError("No QR code was detected in extended_qr.png.")

for result in results:
    decoded = result.code_text
    print("BarCode CodeText:", decoded)

if "\\num" in decoded or "\\alnum" in decoded:
        print("Selectors were encoded literally — check that encode_mode is EXTENDED.")
    elif decoded == EXPECTED:
        print("Verified: all four segments decoded and concatenated as expected.")
    else:
        print("Mismatch. Expected:", EXPECTED)

Vysvětlení

  • DecodeType.QR omezuje rozpoznávání na QR symboly, což je rychlejší než skenování všech podporovaných symbologií a zabraňuje tomu, aby byl poškozený symbol dekódován jako něco jiného.
  • list(...) dělá případ selhání explicitním. Selhání rozpoznání vrací prázdný iterovatelný objekt místo vyvolání výjimky, takže nechráněná smyčka for nad neúspěšným čtením končí tiše a je považována za úspěšnou.
  • Kontrola doslovného \num zachytí nejčastější chybu v tomto pracovním postupu: nastavení segmentů správně a zapomenutí nastavit encode_mode.
  • Dekódované užitečné data jsou surové segmenty spojené dohromady, přičemž veškeré informace o režimu jsou během kódování spotřebovány. Režimy kódování jsou instrukce pro kodér, ne součást dat.

6. Změřte, zda ruční nastavení režimu pomohlo

Nastavení režimu kódování ručně je optimalizace, takže to změřte místo předpokládání. Vygenerujte stejný payload oběma způsoby a porovnejte:

RAW = "1234567ASPOSE2026aspose2026"

# Automatic Mode Selection.
auto = BarcodeGenerator(EncodeTypes.QR, RAW)
auto.save("qr_auto.png")

# Manually Set Modes per Segment.
builder = QrExtCodetextBuilder()
builder.add_codetext_with_compaction_mode(QrExtCompactionMode.NUMERIC, "1234567")
builder.add_codetext_with_compaction_mode(QrExtCompactionMode.ALPHA_NUMERIC, "ASPOSE2026")
builder.add_codetext_with_compaction_mode(QrExtCompactionMode.BYTES, "aspose2026")

manual = BarcodeGenerator(EncodeTypes.QR, builder.get_extended_codetext())
manual.parameters.barcode.qr.encode_mode = QREncodeMode.EXTENDED
manual.save("qr_manual.png")

print("Compare qr_auto.png and qr_manual.png — count modules along one edge.")

Spočítejte moduly podél jedné hrany každého obrázku. Symbol QR verze n má rozměr 17 + 4n modulů na straně, takže verze 2 je 25×25 a verze 3 je 29×29. Pokud oba skončí ve stejné verzi, automatická analýza již našla optimální segmentaci a ruční nastavení režimu bylo údržbovou zátěží bez zisku. Zjištění toho před odesláním je užitečný výsledek, ne zbytečný krok.

Získat bezplatnou licenci

Aspose nabízí dočasnou bezplatnou licenci, která odstraňuje omezení hodnocení a odemyká plnou funkčnost pro testování. Požádejte o ni na Stránka dočasné licence Aspose a použijte ji před jakýmkoli voláním generování nebo rozpoznání.

Bezplatné další zdroje

Závěr

Nastavení režimů kódování QR kódu v Pythonu se redukuje na dvě otázky: který segment získá který režim a jak řeknete generátoru, aby tuto volbu respektoval. QrExtCodetextBuilder a QrExtCompactionMode odpovídají na první otázku v aplikačním kódu; QREncodeMode.EXTENDED odpovídá na druhou v generátoru. Tento průvodce pokrývá jak API builderu, tak inline syntaxi selektoru, kterou vytváří, generuje čtyřsegmentový QR symbol, ověřuje dekódované data a měří rozdíl ve velikosti oproti automatickému režimu.

Upřednostněte builder pro aplikační kód — zachytí chyby režimu na místě volání místo ve skeneru. A zachovejte krok měření. Nastavení režimu ručně je skutečnou výhodou u dlouhých homogenních payloadů a čistou ztrátou u krátkých smíšených, kde režimové přepínání překračuje úspory. Vygenerujte oba, porovnejte počty modulů a nechte výsledek rozhodnout, který kód budete udržovat.

FAQs

  1. Co je kódovací režim QR kódu a proč bych jej měl používat? Kódovací režim říká generátoru QR, jak má zacházet se segmentem dat — číselnými, alfanumerickými, bajtovými nebo Kanji. Každý režim má jinou hustotu dat, takže výběrem správného režimu pro každý segment udržíte verzi QR kódu, a tím i symbol, co nejmenší. Aspose.BarCode nazývá tyto režimy kompresními režimy; specifikace QR je nazývá kódovacími režimy.

  2. Jaké režimy kódování podporuje QrExtCompactionMode? QrExtCompactionMode poskytuje NUMERIC, ALPHA_NUMERIC, BYTES a KANJI, což odpovídá čtyřem režimům QR dat definovaným v ISO/IEC 18004.

  3. Mám použít QrExtCodetextBuilder nebo inline EXTENDED selektory pro nastavení režimu? Používejte builder pro aplikační kód. Je typově kontrolován, zabraňuje chybám při úniku zpětných lomítek a sestavuje rozšířený kódový text za vás. Inline selektory jsou užitečné, když kódový text přichází z konfigurace, databáze nebo jiného systému, který nemůže volat builder.

  4. Jak se režim kódování EXTENDED liší od standardního režimu kódování QR? Režim EXTENDED způsobí, že generátor čte text kódu jako sérii předdefinovaných segmentů, z nichž každý má svůj vlastní režim kódování, místo aby prováděl automatickou detekci režimu na celém řetězci.

  5. Mohu nastavit různé režimy kódování pro různé části jednoho QR kódu? Ano. Přidejte několik segmentů do QrExtCodetextBuilder, každý s jiným QrExtCompactionMode, a builder vytvoří jediný rozšířený kódový text pokrývající všechny.

  6. Je QR kód vygenerovaný s kombinovanými režimy kódování kompatibilní se standardními čtečkami? Ano. Víceúrovňové kódování je součástí specifikace QR, takže jakýkoli kompatibilní skener dekóduje payload správně a vrátí spojená data.

  7. Zda nastavení režimu kódování ručně vždy vede k menšímu QR kódu? Ne. Každý segmentový limit stojí indikátor režimu a pole počtu znaků, takže rozdělení dat do mnoha krátkých segmentů může symbol zvětšit. Ruční výběr režimu se vyplatí u dlouhých, homogenních sekvencí číselných nebo kanji dat.

  8. Potřebuji licenci k nastavení režimů kódování QR pomocí QrExtCodetextBuilder? API můžete vyzkoušet bez licence, s výhradou evaluačních omezení. Bezplatná dočasná licence z webu Aspose odstraňuje tato omezení během testování a pro produkční použití je vyžadována plná licence.

  9. Jaká verze Aspose.BarCode for python-net podporuje tyto API? QrExtCodetextBuilder, QrExtCompactionMode a QREncodeMode.EXTENDED jsou k dispozici v Aspose.BarCode for Python via .NET 26.6 a novější.

Číst více