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

