BOM signifie Byte Order Mark
👉 en français : marque d’ordre des octets

C’est une séquence d’octets placée au tout début d’un fichier texte pour indiquer :

l’encodage du fichier

parfois l’ordre des octets (endianness)

📌 À quoi sert un BOM ?
1️⃣ Identifier l’encodage

Quand un logiciel ouvre un fichier, le BOM lui dit :

« Ce fichier est en UTF-8 / UTF-16 / UTF-32 »

Sans BOM, certains outils devinent l’encodage… et se trompent.

2️⃣ Indiquer l’ordre des octets (UTF-16 / UTF-32)

Pour les encodages multi-octets :

Little Endian

Big Endian

Le BOM permet de savoir dans quel ordre lire les octets.

Sur L’IBMi on l’utilisera pour échanger un fichier UTF8 avec un autre système que le réclame, ou à l’inverse il faudra l’enlever sur un fichier recu !

Voici 2 procédures pour vous aider

Un pour ajouter un BOM sur un fichier à envoyer

CREATE OR REPLACE PROCEDURE AJOUTER_BOM (
IN p_path VARCHAR(1024) CCSID 1208,
IN p_bom VARCHAR(10)
)
LANGUAGE SQL
BEGIN
DECLARE v_data BLOB(10M);
DECLARE v_new_data BLOB(10M);
DECLARE v_bom BLOB(4);

CREATE OR REPLACE PROCEDURE AJOUTER_BOM (
IN p_path VARCHAR(1024) CCSID 1208,
IN p_bom VARCHAR(10)
)
LANGUAGE SQL
BEGIN
DECLARE v_data BLOB(10M);
DECLARE v_new_data BLOB(10M);
DECLARE v_bom BLOB(4);-- Déterminer le BOM à ajouter
SET v_bom =
    CASE UPPER(p_bom)
        WHEN 'UTF8'     THEN X'EFBBBF'
        WHEN 'UTF16LE'  THEN X'FFFE'
        WHEN 'UTF16BE'  THEN X'FEFF'
        ELSE NULL
    END;

IF v_bom IS NULL THEN
    SIGNAL SQLSTATE '38001'
        SET MESSAGE_TEXT = 'BOM non reconnu (UTF8, UTF16LE, UTF16BE)';
END IF;

-- Lire le fichier
SELECT DATA
  INTO v_data
  FROM TABLE (
    QSYS2.IFS_READ_BINARY(p_path)
  );

-- Vérifier si le BOM est déjà présent
IF SUBSTR(v_data, 1, LENGTH(v_bom)) <> v_bom THEN
    SET v_new_data = v_bom || v_data;

    -- Réécriture du fichier avec BOM
    CALL QSYS2.IFS_WRITE_BINARY(
        PATH_NAME => p_path,
        DATA      => v_new_data,
        REPLACE   => 1
    );
END IF;
END;

Une pour enlever le BOM

CREATE OR REPLACE PROCEDURE SUPPRIMER_BOM (
IN p_path VARCHAR(1024) CCSID 1208,
IN p_bom VARCHAR(10)
)
LANGUAGE SQL
BEGIN
DECLARE v_data BLOB(10M);
DECLARE v_bom BLOB(4);
DECLARE v_len INTEGER;-- Déterminer le BOM à supprimer
SET v_bom =
    CASE UPPER(p_bom)
        WHEN 'UTF8'     THEN X'EFBBBF'
        WHEN 'UTF16LE'  THEN X'FFFE'
        WHEN 'UTF16BE'  THEN X'FEFF'
        WHEN 'UTF32LE'  THEN X'FFFE0000'
        WHEN 'UTF32BE'  THEN X'0000FEFF'
        ELSE NULL
    END;

IF v_bom IS NULL THEN
    SIGNAL SQLSTATE '38001'
        SET MESSAGE_TEXT =
          'BOM non reconnu (UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE)';
END IF;

SET v_len = LENGTH(v_bom);

-- Lire le fichier
SELECT DATA
  INTO v_data
  FROM TABLE (
    QSYS2.IFS_READ_BINARY(p_path)
  );

-- Vérifier et supprimer le BOM demandé
IF SUBSTR(v_data, 1, v_len) = v_bom THEN
    SET v_data = SUBSTR(v_data, v_len + 1);

    -- Réécrire le fichier sans BOM
    CALL QSYS2.IFS_WRITE_BINARY(
        PATH_NAME => p_path,
        DATA      => v_data,
        REPLACE   => 1
    );
END IF;
END;

Conclusion

Sur IBMi ca ne sert à rien le CCSID donne cette information

pour en savoir plus Indicateur d’ordre des octets — Wikipédia