BOM toevoegen aan UTF-8-bestanden

Ik zoek (zonder succes) naar een script dat zou werken als een batchbestand en me in staat zou stellen een UTF-8-tekstbestand vooraf te laten gaan aan een stuklijst als het er geen heeft.

Noch de taal waarin het is geschreven (perl, python, c, bash) noch het besturingssysteem waarop het werkt, maakt voor mij niet uit. Ik heb toegang tot een breed scala aan computers.

Ik heb veel scripts gevonden om het omgekeerde te doen (strip de stuklijst), wat voor mij nogal dwaas klinkt, aangezien veel Windows-programma’s problemen zullen hebben met het lezen van UTF-8-tekstbestanden als ze geen Stuklijst.

Heb ik het voor de hand liggende gemist?

Bedankt!


Antwoord 1, autoriteit 100%

Ik heb deze addbom.sh geschreven met de opdracht ‘file’ en de opdracht ‘uconv’ van ICU.

#!/bin/sh
if [ $# -eq 0 ]
then
        echo usage $0 files ...
        exit 1
fi
for file in "$@"
do
        echo "# Processing: $file" 1>&2
        if [ ! -f "$file" ]
        then
                echo Not a file: "$file" 1>&2
                exit 1
        fi
        TYPE=`file - < "$file" | cut -d: -f2`
        if echo "$TYPE" | grep -q '(with BOM)'
        then
                echo "# $file already has BOM, skipping." 1>&2
        else
                ( mv "${file}" "${file}"~ && uconv -f utf-8 -t utf-8 --add-signature < "${file}~" > "${file}" ) || ( echo Error processing "$file" 1>&2 ; exit 1)
        fi
done

edit:Aanhalingstekens toegevoegd rond de mv-argumenten. Bedankt @DirkR en blij dat dit script zo nuttig is geweest!


Antwoord 2, autoriteit 94%

De gemakkelijkste manier die ik hiervoor heb gevonden is

#!/usr/bin/env bash
#Add BOM to the new file
printf '\xEF\xBB\xBF' > with_bom.txt
# Append the content of the source file to the new file
cat source_file.txt >> with_bom.txt

Ik weet dat het een extern programma (cat) gebruikt… maar het zal het werk gemakkelijk doen in bash

Getest op osx maar zou ook op linux moeten werken

LET OP dat het ervan uitgaat dat het bestand nog geen stuklijst (!) heeft


Antwoord 3, autoriteit 46%

(Antwoord gebaseerd op https://stackoverflow.com/a/9815107/1260896door yingted)

Om stuklijsten toe te voegen aan alle bestanden die beginnen met “foo-“, kun je sedgebruiken. sedheeft een optie om een ​​back-up te maken.

sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' foo-*

Als u zeker weet dat er nog geen stuklijst is, kunt u de opdracht vereenvoudigen:

sed -i '1s/^/\xef\xbb\xbf/' foo-*

Zorg ervoor dat u UTF-8 moet instellen, want UTF-16 is anders (controleer anders Hoe kan ik opnieuw een unicode bytevolgordemarkering in linux?)


Antwoord 4, autoriteit 32%

Als verbetering van de oplossing van Yaron U. kunt u het allemaal op één regel doen:

printf '\xEF\xBB\xBF' | cat - source.txt > source-with-bom.txt

De cat -bit zegt om samen te voegen naar de voorkant van source.txtwat wordt doorgesluisd vanuit de printopdracht. Getest op OS X en Ubuntu.


Antwoord 5, autoriteit 6%

Ik vind het vrij eenvoudig. Ervan uitgaande dat het bestand altijdUTF-8 is (u detecteert de codering niet, u kentde codering):

Lees de eerste drie tekens. Vergelijk ze met de UTF-8 BOM-reeks (wikipedia zegt dat het 0xEF,0xBB,0xBF is).
Als het hetzelfde is, druk ze dan af in het nieuwe bestand en kopieer dan al het andere van het originele bestand naar het nieuwe bestand.
Als het anders is, drukt u eerst de stuklijst af, drukt u vervolgens de drie tekens af en drukt u pas daarna al het andere af van het oorspronkelijke bestand naar het nieuwe bestand.

In C zou fopen/fclose/fread/fwrite voldoende moeten zijn.

Other episodes