Każdy generator QR domyślnie wybiera tryb kodowania, a w większości przypadków to ustawienie jest wystarczające. Przestaje być wystarczające w momencie, gdy potrzebujesz nad nim kontroli — numeryczny identyfikator obok kodu produktu, blok japońskiego tekstu, którego nie chcesz przechowywać jako UTF‑8, lub ładunek, w którym potrzebujesz tych samych bajtów przy każdym generowaniu. Ten przewodnik pokazuje, jak ustawić tryby kodowania QR w Pythonie explicite, używając Aspose.BarCode for Python via .NET, tak aby pojedynczy symbol QR mógł zawierać segment numeryczny, segment alfanumeryczny, segment bajtowy i segment Kanji — każdy przechowywany w trybie, który najlepiej mu odpowiada.
Aspose.BarCode nazywa je trybami kompresji w swoich własnych nazwach API (QrExtCompactionMode), a specyfikacja QR określa je jako tryby kodowania. Są to te same cztery tryby pod dwiema nazwami, a w tym przewodniku używamy terminu “tryb kodowania” w całym dokumencie, ponieważ jest to określenie używane w specyfikacji i w większości bibliotek QR w Pythonie.
Dlaczego tryby kodowania QR wpływają na rozmiar symbolu i niezawodność skanowania
Rozmiar fizyczny kodu QR zależy od liczby bitów potrzebnych do jego ładunku, a liczba bitów na znak zależy całkowicie od trybu kodowania użytego dla tego segmentu. Specyfikacja definiuje cztery tryby danych o wyraźnie różnej gęstości:
| Tryb | Zestaw znaków | Przechowywanie | Koszt na znak |
|---|---|---|---|
| Numeryczny | Cyfry 0-9 | 3 cyfry na 10 bitów | 3,33 bita |
| Alfanumeryczny | Cyfry, wielkie litery A-Z, spacja, $%*+-./: | 2 znaki na 11 bitów | 5,5 bita |
| Bajt | Dowolne dane 8-bitowe, zazwyczaj UTF-8 | 1 bajt na 8 bitów | 8 bitów |
| Kanji | Znaki podwójnego bajtu Shift-JIS | 1 znak na 13 bitów | 13 bitów |
Identyfikator 30‑cyfrowy kosztuje w przybliżeniu 100 bitów w trybie numerycznym i 240 bitów w trybie bajtowym. Ta różnica jest często wystarczająca, aby podnieść symbol o kilka wersji QR, a wyższa wersja oznacza więcej modułów w tym samym obszarze wydruku — mniejsze moduły i niższą skuteczność odczytu przy kamerach o niskiej rozdzielczości, zakrzywionych opakowaniach i zużytych etykietach.
Automatyczny wybór trybu radzi sobie dobrze z większością ładunków. Staje się ograniczający, gdy znasz strukturę swoich danych, a analizator nie: długi ciąg liczbowy przerwany pojedynczą literą, japoński tekst, dla którego tryb bajtowy zużywałby trzy bajty UTF‑8 na znak, lub identyfikator o stałym formacie, w którym chcesz deterministyczny wynik we wszystkich wersjach biblioteki.
Kiedy ręczne ustawianie trybu ma sens
Przełączanie trybów nie jest darmowe. Każde graniczne segmentu zapisuje czterobitowy wskaźnik trybu plus pole liczby znaków od ośmiu do szesnastu bitów, w zależności od wersji QR. Nadmierne segmentowanie ładunku może spowodować większy symbol niż pozostawienie decyzji generatorowi.
Ustawienie trybu jawnie opłaca się, gdy:
- Ładunek zawiera długie, jednorodne ciągi — 40‑cyfrowy numer seryjny, akapit kanji.
- Kodujesz tekst japoński i chcesz tryb Kanji z 13 bitami na znak zamiast trybu bajtowego z 24.
- Potrzebujesz powtarzalnego, identycznego bajtowo wyniku dla testów regresyjnych lub weryfikacji sumy kontrolnej.
Zazwyczaj nie warto dodatkowej złożoności przy krótkich ładunkach, danych, które zmieniają typ co kilka znaków, lub adresach URL, które automatyczna analiza już dobrze obsługuje. Podrozdział pomiaru poniżej pokazuje, jak sprawdzić, w którym przypadku się znajdujesz.
Dwa sposoby ustawiania trybów kodowania QR w Pythonie
Aspose.BarCode oferuje dwie ścieżki do tego samego zakodowanego wyniku i warto wiedzieć, dlaczego obie istnieją, zanim zaczniemy pisać kod.
QrExtCodetextBuilder | Rozszerzone selektory w linii | |
|---|---|---|
| Tryb ustawiany przez | Wywołania metod z wartościami wyliczenia | Markery ukośnika w ciągu |
| Błędy wykrywane | W miejscu wywołania | Tylko w czasie dekodowania |
| Problemy z escapowaniem | Brak | \\ escapowanie lub surowe łańcuchy |
| Najlepsze dla | Kod aplikacji | Kod tekstowy z konfiguracji, bazy danych lub innego systemu |
Builder jest lepszym domyślnym wyborem. QrExtCompactionMode.NUMERIC albo istnieje, albo natychmiast podnosi AttributeError, podczas gdy błędnie wpisane \numm w łańcuchu cicho staje się danymi ładunku i pojawia się dopiero, gdy ktoś zeskanuje etykietę. Oba podejścia używają tego samego ustawienia generatora QREncodeMode.EXTENDED, więc możesz przełączać się między nimi bez zmiany czegokolwiek w dalszej części.
Ustaw tryby kodowania QR w Pythonie: krok po kroku
1. Instalacja i przygotowanie środowiska programistycznego
Aspose.BarCode for Python via .NET to biblioteka wieloplatformowa obsługująca generowanie, rozpoznawanie i manipulację ponad 50 symbolami, w tym QR. Zainstaluj z PyPI:
pip install aspose-barcode-for-python-via-net
Potwierdź wersję, ponieważ te interfejsy API wymagają wersji 26.6 lub nowszej:
pip show aspose-barcode
Następnie zweryfikuj, czy import się udaje. Pakiet wiąże się z środowiskiem uruchomieniowym .NET, więc udany import mówi więcej niż sama obecność plików na dysku:
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']
Jeśli brakuje EXTENDED, używasz wersji starszej niż 26.6 i musisz zaktualizować przed kontynuacją.
Jeśli masz plik licencji, zastosuj go raz przy uruchamianiu aplikacji, przed jakimkolwiek wywołaniem generacji lub rozpoznawania:
from aspose.barcode import License
license = License()
license.set_license("Aspose.BarCode.Python.NET.lic")
2. Ustaw tryb kodowania dla każdego segmentu za pomocą QrExtCodetextBuilder
QrExtCodetextBuilder przechowuje uporządkowaną listę segmentów. Każde wywołanie dołącza dane wraz z trybem kodowania, w którym powinny być przechowywane, a get_extended_codetext() składa je w ciąg w formacie rozszerzonym, który rozumie generator.
- Importuj klasy generacji.
- Utwórz
QrExtCodetextBuilder. - Dodaj segment numeryczny przy użyciu
QrExtCompactionMode.NUMERIC. - Dodaj segment alfanumeryczny przy użyciu
QrExtCompactionMode.ALPHA_NUMERIC. - Dodaj segment bajtowy przy użyciu
QrExtCompactionMode.BYTES. - Dodaj segment Kanji przy użyciu
QrExtCompactionMode.KANJI. - Pobierz połączony rozszerzony kod tekstowy.
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))
Wyjaśnienie
- Każde wywołanie
add_codetext_with_compaction_modeustawia tryb kodowania dla jednego segmentu. Kolejność ma znaczenie — dekoder zwraca segmenty połączone w kolejności, w jakiej zostały dodane. - Zestaw alfanumeryczny jest celowo wąski: cyfry, wielkie litery A‑Z, spacja oraz
$%*+-./:. DlategoASPOSE2026pasuje do trybu alfanumerycznego, aaspose2026nie. Małe litery nie należą do tego zestawu, więc taki segment musi używać trybuBYTES. Przekazywanie małych liter doALPHA_NUMERICjest najczęściej popełnianym błędem przy ustawianiu trybów w ten sposób. - Segment Kanji używa znaków od
\u3062, które są hiraganą, a nie właściwymi kanji. Tryb Kanji obejmuje dwubajtowy zakres Shift‑JIS, który zawiera kana, więc te znaki są kodowane przy użyciu 13 bitów każdy, zamiast 24 bitów, które tryb bajtowy zużyłby na każdy z nich w UTF‑8. get_extended_codetext()generuje ciąg znaków, który generator analizuje w trybie EXTENDED. Wydrukowanie go przy użyciurepr()warto zrobić raz — pokazuje składnię selektora emitowaną przez builder, co dokładnie jest zapisane ręcznie w następnym podrozdziale.
3. Ustaw tryb kodowania w linii, bez użycia Buildera
Gdy kod tekstowy pochodzi spoza Twojego kodu w Pythonie, możesz ustawić tryb każdego segmentu bezpośrednio za pomocą selektora. Każdy znacznik poprzedzony odwrotnym ukośnikiem kontroluje każdy znak aż do pojawienia się kolejnego znacznika:
| Selector | Ustawia tryb na |
|---|---|
\num | Numeryczny |
\alnum | Alfanumeryczny |
\byte | Bajt, UTF-8 |
\kanji | Kanji, Shift-JIS |
\auto | Automatyczny wybór trybu |
# 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"
)
Zwróć uwagę na ucieczki. W normalnym łańcuchu Pythona, "\num" nie jest selektorem — jest to znak nowej linii, po którym następuje um. Surowe łańcuchy (r"...") unikają tego problemu, ale surowy łańcuch również blokuje sekwencje ucieczki \u, co jest powodem, dla którego linia Kanji powyżej używa zwykłego łańcucha z \\kanji. Ta pułapka związana z ucieczkami jest praktycznym argumentem za preferowaniem buildera w sekcji 2.
4. Wygeneruj kod QR w trybie EXTENDED
Ustawianie trybów per‑segment nie ma efektu, dopóki generator nie zostanie poinstruowany, aby je odczytał. Bez QREncodeMode.EXTENDED informacje o segmencie są ignorowane, a znaczniki selektora są kodowane jako dosłowny tekst ładunku.
- Utwórz
BarcodeGeneratorzEncodeTypes.QRi rozszerzonym kodem tekstowym. - Ustaw
encode_modenaQREncodeMode.EXTENDED. - Skonfiguruj rozdzielczość oraz opcjonalnie poziom korekcji błędów i margines.
- Zapisz kod kreskowy jako bezstratny 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")
Wyjaśnienie
gen.parameters.barcode.qr.encode_mode = QREncodeMode.EXTENDEDto linia, która aktywuje parsowanie segmentów. Pomiń ją, a generator utworzy prawidłowy, skanowalny kod QR zawierający dosłowny tekst\num1234567...— dlatego w następnym podrozdziale weryfikujemy, a nie zakładamy.gen.parameters.resolution = 300renderuje w rozdzielczości druku. Symbole przeznaczone do drukarek etykiet lub grafiki opakowań powinny być generowane w ostatecznym rozmiarze, a nie skalowane później, co zmiękcza krawędzie modułów.savezapisuje bezstratny PNG. Unikaj JPEG dla dowolnej symbologii 2D — jego artefakty kompresji rozmywają siatkę modułów, którą odczytuje dekoder.
5. Sprawdź, czy tryb kodowania został zastosowany
Udane wygenerowanie nie dowodzi niczego na temat tego, czy tryby per‑segment zostały zastosowane. Krok dekodowania jest tym, co oddziela prawidłowo zakodowany symbol od tego, który niesie znaczniki selektora jako dane.
- Zainicjuj
BarCodeReaderz ścieżką do pliku iDecodeType.QR. - Umaterializuj wyniki, aby niepowodzenie odczytu było widoczne.
- Porównaj zdekodowany tekst z oczekiwanym połączeniem.
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)
Wyjaśnienie
DecodeType.QRogranicza rozpoznawanie do symboli QR, co jest szybsze niż skanowanie każdej obsługiwanej symboliki i zapobiega dekodowaniu nieprawidłowego symbolu jako czegoś innego.list(...)wyraźnie określa przypadek niepowodzenia. Niepowodzenie rozpoznania zwraca pusty iterowalny zamiast podnosić wyjątek, więc niechroniona pętlafornad nieudaną próbą odczytu kończy się cicho i jest traktowana jako sukces.- Sprawdzanie dosłownego
\numłapie najczęstszy błąd w tym przepływie pracy: prawidłowe ustawienie segmentów i zapomnienie o ustawieniuencode_mode. - Zdekodowane ładunki to surowe segmenty połączone razem, przy czym cała informacja o trybach została zużyta podczas kodowania. Tryby kodowania są instrukcjami dla kodera, a nie częścią danych.
6. Zmierz, czy ręczne ustawienie trybu pomogło
Ustawienie trybu kodowania ręcznie jest optymalizacją, więc należy to zmierzyć, a nie zakładać. Wygeneruj ten sam ładunek w obu wariantach i porównaj:
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.")
Policz moduły wzdłuż jednego brzegu każdego obrazu. Symbol QR wersji n ma 17 + 4n modułów po bokach, więc wersja 2 to 25×25, a wersja 3 to 29×29. Jeśli oba przypadki trafiają na tę samą wersję, automatyczna analiza już znalazła optymalną segmentację, a ręczne ustawianie trybu było obciążeniem konserwacyjnym bez korzyści. Odkrycie tego przed wysyłką jest użytecznym wynikiem, a nie zmarnowanym krokiem.
Uzyskaj darmową licencję
Aspose oferuje tymczasową darmową licencję, która znosi ograniczenia wersji ewaluacyjnej i odblokowuje pełną funkcjonalność do testów. Zamów ją ze strony tymczasowej licencji Aspose i zastosuj przed wywołaniem jakiejkolwiek generacji lub rozpoznawania.
Darmowe dodatkowe zasoby
Wnioski
Ustawianie trybów kodowania kodów QR w Pythonie sprowadza się do dwóch pytań: który segment otrzymuje który tryb oraz jak poinformować generator, aby szanował ten wybór. QrExtCodetextBuilder i QrExtCompactionMode odpowiadają na pierwsze pytanie w kodzie aplikacji; QREncodeMode.EXTENDED odpowiada na drugie w generatorze. Ten przewodnik obejmuje zarówno API buildera, jak i składnię selektora inline, którą generuje, tworząc czterosegmentowy symbol QR, weryfikując zdekodowane dane oraz mierząc różnicę rozmiaru w porównaniu z trybem automatycznym.
Preferuj builder w kodzie aplikacji — wykrywa błędy trybu w miejscu wywołania, a nie w skanerze. I zachowaj krok pomiarowy. Ustawianie trybu ręcznie to prawdziwa korzyść przy długich jednorodnych ładunkach i strata przy krótkich mieszanych, gdzie narzut przełączania trybu przewyższa oszczędności. Wygeneruj oba, porównaj liczbę modułów i pozwól wynikowi zdecydować, który kod utrzymujesz.
FAQs
Czym jest tryb kodowania QR i dlaczego miałbym go używać? Tryb kodowania informuje generator QR, jak traktować segment danych — numeryczny, alfanumeryczny, bajtowy lub Kanji. Każdy tryb ma inną gęstość danych, więc wybór odpowiedniego dla każdego segmentu utrzymuje wersję QR, a tym samym symbol, jak najmniejszy. Aspose.BarCode nazywa je trybami kompresji; specyfikacja QR określa je jako tryby kodowania.
Jakie tryby kodowania obsługuje QrExtCompactionMode?
QrExtCompactionModezapewniaNUMERIC,ALPHA_NUMERIC,BYTESiKANJI, odpowiadając czterem trybom danych QR zdefiniowanym w ISO/IEC 18004.Czy powinienem używać QrExtCodetextBuilder czy selektorów inline EXTENDED do ustawiania trybu? Użyj buildera w kodzie aplikacji. Jest sprawdzany pod kątem typów, unika błędów związanych z ucieczką znaków backslash i składa rozszerzony kod tekstowy za Ciebie. Selektory inline są przydatne, gdy kod tekstowy pochodzi z konfiguracji, bazy danych lub innego systemu, który nie może wywołać buildera.
Jak tryb kodowania EXTENDED różni się od standardowego trybu kodowania QR? Tryb EXTENDED powoduje, że generator odczytuje kod jako serię predefiniowanych segmentów, z których każdy ma własny tryb kodowania, zamiast automatycznego wykrywania trybu na całym ciągu.
Czy mogę ustawić różne tryby kodowania dla różnych części jednego kodu QR? Tak. Dodaj kilka segmentów do
QrExtCodetextBuilder, każdy z innymQrExtCompactionMode, a konstruktor wygeneruje pojedynczy rozszerzony kod tekstowy obejmujący wszystkie.Czy kod QR wygenerowany przy użyciu mieszanych trybów kodowania jest kompatybilny ze standardowymi czytnikami? Tak. Kodowanie wielosegmentowe jest częścią specyfikacji QR, więc każdy zgodny skaner prawidłowo dekoduje ładunek i zwraca połączone dane.
Czy ręczne ustawienie trybu kodowania zawsze powoduje mniejszy kod QR? Nie. Każda granica segmentu kosztuje wskaźnik trybu i pole liczby znaków, więc podzielenie danych na wiele krótkich segmentów może spowodować, że symbol będzie większy. Ręczny wybór trybu opłaca się przy długich, jednorodnych ciągach danych numerycznych lub Kanji.
Czy potrzebuję licencji, aby ustawić tryby kodowania QR przy użyciu QrExtCodetextBuilder?
Możesz ocenić API bez licencji, z zastrzeżeniem ograniczeń oceny. Darmowa tymczasowa licencja ze strony Aspose znosi te ograniczenia podczas testów, a użycie produkcyjne wymaga pełnej licencji.Jaka wersja Aspose.BarCode for python-net obsługuje te API?
QrExtCodetextBuilder,QrExtCompactionModeiQREncodeMode.EXTENDEDsą dostępne w Aspose.BarCode for Python via .NET 26.6 i późniejszych.
