GS1 Sunrise 2027:全球贸易转向二维条码

博客分类:条形码   .NET

2025/08/07

GS1 Sunrise 2027 是一项全球性项目,旨在将传统的 EAN/UPC 一维条码过渡到二维条码,以提高产品的透明度、可追溯性和安全性。到 2027 年底,全球零售、医疗保健和其他行业的企业预计将被要求在其销售点 (POS) 和服务点 (POC) 实施新的产品识别标准。Sunrise 2027 计划已在 48 个国家/地区进行测试,覆盖全球 88% 的 GDP,正逐渐成为全球贸易的新标准。

作为条形码识别专用工具 VintaSoft 的开发商,VintaSoft Barcode .NET SDK 将这些变化视为一个战略机遇,可以实现客户业务流程的现代化,并在新的监管环境下扩展 SDK 的功能。



什么是 GS1 Sunrise 2027?

Sunrise 2027 是 GS1 在 2020 年代正式发布的一项计划,旨在确保到 2027 年,全球零售和物流系统能够扫描和解读二维条形码以及我们熟悉的 1 维条形码。然而,其主要目标是用更通用的 2 维条形码取代 1 维条形码,后者不仅能够识别产品,还能传输其他数据,例如有效期、批号、原产国、质量证书等。


为什么整个行业都在转型?

旧的 EAN/UPC 格式已被证明存在局限性:

GS1 DataMatrix 和 GS1 Digital Link QR 等二维条码通过以下方式解决这些问题:


这将如何影响市场参与者?

GS1 发起的向二维条形码的过渡将影响商品链中的几乎所有参与者--从制造商到软件开发商。这些变化不能被视为简单的技术升级--我们谈论的是物流、零售和与消费者互动中基本流程的重组。

制造企业将率先感受到新标准的影响。他们必须改造生产线和包装流程,以打印新的条形码。过去只需在包装上贴上包含全球贸易项目代码 (GTIN) 的线性条形码即可,而现在二维条形码需要包含更多信息:有效期、批号、成分信息,有时甚至还需要指向数字证书或网站的链接。所有这些都需要升级设备和用于生成和管理新条形码的 IT 基础设施。

对于零售商和物流运营商而言,主要挑战在于收银机和仓库扫描设备的适配。虽然大多数现代扫描器已支持二维条码,但并非所有扫描器都针对GS1标准进行了优化。这意味着不仅需要更新设备,还需要修改软件,才能正确识别和处理新的数据字段。

软件解决方案的开发商,包括会计系统、ERP、收银机应用程序和移动解决方案的开发商,也必须为条形码格式的变更做好准备。他们不仅需要添加对新符号系统的支持,还需要根据GS1标准正确解读数据结构。这包括处理应用程序标识符(AI)、解析嵌套字段,以及在使用GS1数字链接格式的情况下,与外部Web服务进行交互。在此,识别的准确性尤为重要,因为数据解读错误可能导致物流故障、退货,甚至法律后果。


二维条码的独特之处

二维条码是自动识别系统的下一个发展阶段。它们不仅可以取代线性条码,而且凭借其多功能性和信息丰富性,为商业、生产和物流开辟了新的机遇。

与只能包含基本产品标识符(GTIN)的一维条码(例如EAN/UPC)不同,二维条码能够传递现代供应链和数字服务所需的各种参数。

二维条码的主要优势包括:

向新的条码系统过渡不仅鼓励企业遵守标准,还鼓励企业构建连接实体包装和在线体验的数字生态系统。


GS1 Sunrise 2027实施阶段

信息和自愿阶段

知识传播、试点项目、内部系统调整、双重标签(1D + 2D)测试。企业有时间进行技术现代化改造和测试。


行业和地区强制实施

特定产品类别和地区强制过渡到使用二维条码。重点在于更新POS设备、培训人员以及确保供应链的兼容性。


全面合规和集成

到2027年底,所有受该标准约束的企业必须完全切换到二维条码,并在条件允许的情况下取代传统的EAN/UPC条码。标准及其支持将持续更新。


过渡期间的挑战和解决方案

从传统的线性条形码过渡到二维条形码不仅是一项技术升级,也是一项组织挑战。企业面临着诸多实际、技术和监管方面的挑战,尤其是在其基础设施仍然以传统的扫描、打印或条形码处理解决方案为主的情况下。

最常见的困难包括:

尽管存在这些挑战,但适当的规划和选择合适的工具可以大大简化过渡过程。

建议在实践中应用的关键解决方案:

向二维条形码过渡是一个需要全面方法的项目,但借助现代化的工具和合作伙伴,它不仅可行,而且在业务发展前景方面也有利可图。


VintaSoft Barcode .NET SDK 如何帮助企业符合 GS1 Sunrise 2027 标准

VintaSoft 的产品——VintaSoft Barcode .NET SDK——解决了快速、准确地识别一维和二维条形码(包括 DataMatrix 和 QR 码)的问题。这使得企业能够:

向 GS1 Sunrise 2027 的过渡促进了现代供应链的数字化、透明度和安全性。现在就为变革做好准备至关重要,通过投资 VintaSoft Barcode .NET SDK 等解决方案,实现标记和识别工具的现代化,从而高效地读取和处理新的二维条码。


以下 C# 代码演示了如何生成 GS1 数字链接条码并识别生成的条码。
using System;
using System.Text;

using Vintasoft.Barcode;
using Vintasoft.Barcode.BarcodeInfo;
using Vintasoft.Barcode.SymbologySubsets;
using Vintasoft.Barcode.GS1;
using Vintasoft.Imaging;

/// <summary>
/// Test that shows how to encode the barcode data in GS1 Digital Link format,
/// create image with GS1 Digital Link barcode,
/// read GS1 Digital Link barcode from image and print data stored in GS1 format.
/// </summary>
class GS1DigitalLinkExample
{

    /// <summary>
    /// Runs the test (available barcode types QR, DataMatrix).
    /// </summary>
    public static void TestGS1DigitalLink(BarcodeType digitalLinkBarcodeType)
    {
        // GS1 Digital Link barcode
        GS1DigitalLinkBarcodeSymbologySubset barcodeSubset;
        if (digitalLinkBarcodeType == BarcodeType.QR)
            barcodeSubset = BarcodeSymbologySubsets.GS1DigitalLinkQR;
        else if (digitalLinkBarcodeType == BarcodeType.DataMatrix)
            barcodeSubset = BarcodeSymbologySubsets.GS1DigitalLinkDataMatrix;
        else
            throw new NotSupportedException();

        // form the GS1 Application identifiers
        //
        GS1ApplicationIdentifierValue[] aiValues = new GS1ApplicationIdentifierValue[4];
        GS1ApplicationIdentifier ai;
        // 01 - Global Trade Item Number
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("01");
        aiValues[0] = new GS1ApplicationIdentifierValue(ai, "0123456789123C");
        // 310 - Net weight, kilograms
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("310");
        aiValues[1] = new GS1ApplicationIdentifierValue(ai, "0012.55");
        // 30 - Count of Items
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("30");
        aiValues[2] = new GS1ApplicationIdentifierValue(ai, "10");
        // 90 - Company Internal Information
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("90");
        aiValues[3] = new GS1ApplicationIdentifierValue(ai, "ABCabc12345");
        // create GS1 value item
        GS1DigitalLinkValueItem gs1DigitalLinkValue = new GS1DigitalLinkValueItem(new GS1DigitalLink("vintasoft.com", aiValues));

        // create the barcode writer
        using (BarcodeWriter writer = new BarcodeWriter())
        {
            // specify that writer must create output image as 24-bpp image
            writer.Settings.PixelFormat = BarcodeImagePixelFormat.Bgr24;

            // encode GS1 Digital Link barcode
            barcodeSubset.Encode(gs1DigitalLinkValue, writer.Settings);

            // create image with barcode
            using (VintasoftBitmap barcodeImage = writer.GetBarcodeAsVintasoftBitmap())
            {
                // delete aiValues array
                aiValues = null;

                // read barcode with GS1 value

                // create barcode reader
                using (BarcodeReader reader = new BarcodeReader())
                {
                    // specify that reader must search for GS1 Digital Link barcodes only

                    reader.Settings.ScanBarcodeTypes = BarcodeType.None;
                    reader.Settings.ScanBarcodeSubsets.Add(barcodeSubset);

                    // read barcode from image
                    IBarcodeInfo[] infos = reader.ReadBarcodes(barcodeImage);

                    // gets GS1 value from barcode value
                    gs1DigitalLinkValue = (GS1DigitalLinkValueItem)(infos[0].ValueItems[0]);

                    // print barcode type
                    Console.WriteLine("Barcode Type: {0}", infos[0].BarcodeType);
                    Console.WriteLine();

                    // print GS1 Digital Link URI value
                    Console.WriteLine("GS1 Digital Link URI:\n{0}", gs1DigitalLinkValue.DigitalLink.DigitalLinkUri);
                    Console.WriteLine();

                    // gets a GS1 Application identifiers from barcode value
                    aiValues = gs1DigitalLinkValue.ApplicationIdentifierValues;

                    StringBuilder printableValue = new StringBuilder();
                    // print Application identifiers values
                    for (int i = 0; i < aiValues.Length; i++)
                    {
                        GS1ApplicationIdentifierValue aiValue = aiValues[i];
                        ai = aiValue.ApplicationIdentifier;
                        Console.WriteLine(string.Format("[{0}] {1}", i + 1, aiValue));
                        Console.WriteLine(string.Format("Application identifier   : {0}", ai.ApplicationIdentifier));
                        Console.WriteLine(string.Format("Value                    : {0}", aiValue.Value));
                        Console.WriteLine(string.Format("Data title               : {0}", ai.DataTitle));
                        Console.WriteLine(string.Format("Data content             : {0}", ai.DataContent));
                        Console.WriteLine(string.Format("Format                   : {0}", ai.Format));
                        Console.WriteLine(string.Format("Is contains decimal point: {0}", ai.IsContainsDecimalPoint));
                        Console.WriteLine(string.Format("Is variable length       : {0}", ai.IsVariableLength));
                        Console.WriteLine();
                        printableValue.Append(aiValue.ToString());
                    }

                    // print GS1 printable value
                    Console.WriteLine("Printable GS1 value: " + printableValue.ToString());
                }
            }
        }
    }
}