文字與日常工具·二維碼與條碼工具包
為什麼帶有重音的文字有時會在 QR 碼中掃描錯誤:字元集和 ECI
· 背景
二維碼 編碼 瀏覽器處理
解釋了為什麼 QR 標準的預設位元組解釋不是 UTF-8、擴展通道解釋機制的作用以及為什麼一些讀者會針對重音或非拉丁文字顯示 mojibake。
掃描為「é」的名稱 — mojibake 在解碼的二維碼中是什麼樣子以及為什麼會發生
當在另一個字元映射下解釋 UTF-8 位元組時,會出現諸如 é 之類的 Mojibake。 ToolAcre 透過使用 TextEncoder 解決了矩陣產生之前的失敗問題,並測試了往返重音、日語和表情符號範例。
腐敗是沉默的,因為 QR 可以在結構上保持有效。掃描器解碼字節,應用不同的字元解釋並顯示錯誤的文字,因此查找模式和糾錯似乎都起作用。 ToolAcre 的迴歸測試將解碼輸出與原始樣本(例如 `café`、日文文字和表情符號)進行比較。這捕捉了黑色模組的視覺快照永遠無法偵測到的語義損壞。
ToolAcre 預先編碼 UTF-8 位元組以避免依賴項的 Latin-1 預設行為
底層 QR 依賴項將其位元組模式字串視為 Latin-1 傳遞資料。 ToolAcre 首先將預期文字轉換為 UTF-8 位元組,並將每個位元組映射到一個代碼單元,以便庫接收正確的八位元組而不是損壞字元。
轉換包裝器建立一個 `Uint8Array`,將其分塊處理並產生一個二進位字串,其程式碼單元等於 UTF-8 位元組值。然後,該函式庫的 Latin-1 傳遞會保留這些值,而不是重新編碼原始 JavaScript 字元。分塊可以避免向 `String.fromCharCode` 傳遞過多的參數,同時避免全域庫突變會使其他呼叫者保持隔離。
ECI只是背景;此實作並不聲稱發出 ECI 標頭
擴展通道解釋可以標記 QR 系統中的字元編碼,但在此實作中不會出現 ECI 發射。因此,本文不承諾 ECI 標頭,也不將其描述為 ToolAcre UTF-8 支援背後的機制。
ECI 對於解碼器來說是一個單獨的訊號,但 ToolAcre 不會要求或公開該訊號。它的相容性策略是正確的 UTF-8 位元組加上裝置測試,而不是廣告的編碼標頭。這種區別在支援方面很重要:成功的儲存庫往返證明了位元組準備和矩陣復原;它不能證明每個外部讀取器在每個有效負載上下文中都選擇相同的字元解釋。
儲存庫測試證明矩陣往返,而不是跨指定第三方相機應用程式的行為
該存儲庫在測試中解碼產生的矩陣並證明其自己的位元組往返。它不會測試每個相機應用程序,因此有關讀者猜測 UTF-8 或在特定平台上失敗的說法需要單獨的裝置證據。
測試中使用的單元解碼器是受控的並對於回歸有價值,但它不是相機應用程式的目錄。記錄觀眾實際使用的裝置的結果,包括解碼的字串,而不是「掃描成功」。兩個應用程式都可以識別代碼,而一個應用程式則顯示 mojibake。將此類差異報告為讀卡機相容性證據,而不是在不了解解碼器的情況下更改 ToolAcre 的位元組。
降低風險 - 盡可能將有效負載保留為 ASCII、對非 ASCII 路徑進行 URL 編碼以及在多部手機上進行測試
保持有效負載簡潔,當普通 HTTPS URL 可以表示網頁上的多語言內容時,首選普通 HTTPS URL,並在支援的裝置上測試直接非 ASCII 文字。 URL 編碼可能會更改 URL 的字節,並必須保留目標語義。
稳定的 URL 通常會降低這種风险,因為非 ASCII 表示可以存在于目標頁面上,而 QR 有效负载仍然是簡洁的 ASCII 地址。如果 URL 路徑包含國際字符,請保留其正確編碼的目標並進行測試;盲目的百分比編碼或音譯可能會改變路由。對於直接接觸或純文字,請保持測試矩陣較小並使用多個支援的閱讀器進行掃描。
工作範例:驗證實作中的 UTF-8 往返並分別測試外部讀取器
在單獨的測試代碼中對咖啡館、日本和表情符號進行編碼,確認存儲庫的解碼器返回原始文字,然後使用受眾使用的真實應用程式掃描匯出的圖片。記錄差異,而不是透過一部手機進行概括。
使用三個單獨的有效負載 - `café`、一個簡短的日語短語和一個表情符號 - 然後使用存儲庫測試路徑和選定的手機應用程式對每個有效負載進行解碼。比較確切的 Unicode 字符,而不是螢幕截圖或視覺相似性。如果應用程式失敗,請保留匯出的程式碼和解碼的位元組以進行診斷。從相同的輸入重複重新產生應該產生相同的矩陣,並不會修復讀者解釋的差異。
這不包括什麼 - 漢字模式的 Shift JIS 細節和掃描裝置上的字體渲染
漢字模式 Shift JIS 詳細資料和解碼後的字體渲染不在實作範圍內。 QR儲存位元組;掃描器和目標介面決定如何將解碼的字元呈現給拿著手機的人。
Kanji 模式、Shift JIS 和解碼後字型選擇不在實作範圍內。即使正確的 Unicode 也可能在缺乏合適字體的裝置上呈現缺少的字形,這與接收錯誤的字元不同。記錄故障時單獨的位元組損壞、解碼器解釋和字體顯示;它們發生在不同的階段,需要不同的補救措施。
要點 — 在列印之前測試任何非 ASCII 有效負載;二維碼和條碼工具包在本地產生,以便您可以快速迭代
ToolAcre 的經過驗證的宣告是強有力的,但有限制:它正確準備 UTF-8 位元組並往返多語言測試字串。具有非 ASCII 有效負載的印刷版本仍然值得有代表性的讀者測試。
多語言印刷的發布標準是對代表性讀者的精確恢復。 ToolAcre 提供經過驗證的 UTF-8 準備和本地產生,其位元組計數器反映了多位元組成本。發布者仍必須保留經過測試的工件,避免未經審查的有效負載編輯,並在相容性較窄的情況下揭露讀者要求。正確的編碼是必要的,但使用者體驗整個解碼、解釋和顯示鏈。