Wijzig Bestand Codering utf-8 via vim in een script

ik heb knock-down na onze server is bijgewerkt van Debian 4 tot 5.
Wij zijn overgestapt naar UTF-8-omgeving en nu hebben we problemen om de tekst correct wordt afgedrukt op de browser, omdat alle bestanden zijn in niet-utf8 coderingen zoals iso-8859-1, ascii, enz.

Ik geprobeerd veel verschillende scripts.

De eerste die ik geprobeerd heb is iconv. Dat het ene niet werkt, verandert de inhoud, maar de bestanden enconding is nog steeds niet-utf8.

Hetzelfde probleem met enca, encamv, convmv en een aantal andere tools die ik heb geïnstalleerd via apt-get.

Toen vond ik een python-code, die gebruik maakt van chardet Universele Detector module, op te sporen codering van een bestand (dat werkt prima), maar het gebruik van de unicode-klasse of de codec klasse opslaan als utf-8 niet werkt, zonder fouten.

De enige manier die ik gevonden om het bestand en de inhoud omgezet naar UTF-8, vi.

Dit zijn de stappen die ik doe voor een bestand:

vi filename.php
:set bomb
:set fileencoding=utf-8
:wq

Thats it. Dat werkt perfect. Maar hoe kan je deze loopt via een script.
Ik zou graag een script schrijven (linux shell) die doorkruist een directory nemen van alle php bestanden converteren met behulp van vi met de bovenstaande commando ‘ s.
Als ik nodig om te beginnen met de vi app, ik weet niet hoe zoiets als dit doen:

"vi --run-command=':set bomb, :set fileencoding=utf-8' filename.php"

Hoop dat iemand mij kan helpen.

InformationsquelleAutor NovumCoder | 2010-02-22

 

4 Replies
  1. 23

    Dit is de eenvoudigste manier die ik ken om dit te doen eenvoudig vanaf de opdrachtregel:

    vim +"argdo se bomb | se fileencoding=utf-8 | w" $(find . -type f -name *.php)
    

    Of beter nog als het aantal bestanden is naar verwachting vrij groot:

    find . -type f -name *.php | xargs vim +"argdo se bomb | se fileencoding=utf-8 | w"
    
    • Ik weet niet wat dat argdo betekent, maar ik heb dit geprobeerd en het werkt: vim +"set bomb | set fileencoding=utf-8 | wq" $(find . -type f -name *.php)
    • Goed. argdo alleen maar herhaalt het commando voor elk bestand in de argumenten lijst.
  2. 16

    Plaatst u uw commando ‘ s in een bestand, we noemen het script.vim:

    set bomb
    set fileencoding=utf-8
    wq
    

    Dan een beroep Vim met de -S (bron) optie voor het uitvoeren van het script op het bestand dat u wilt herstellen. Om dit te doen op een groot aantal bestanden die je zou kunnen doen

    find . -type f -name "*.php" -exec vim -S script.vim {} \;
    

    Je kan ook de Vim-opdrachten op de opdrachtregel met de + optie, maar ik denk dat het misschien beter leesbaar als deze.

    Opmerking: ik heb dit niet getest.

    • Noten moeten worden voorgelegd aan de aanbeveling. 😉
    • bomb breekt ASCII-compatibiliteit. Zie dit antwoord.
  3. 3

    U eigenlijk wilt set nobomb (BOM = byte order mark), vooral in de [windows] wereld.

    bijvoorbeeld, ik had een script dat lukte niet want er was een bytevolgordemarkering aan het begin. Het is meestal niet weergegeven in de editor (zelfs met lijst in de vi), of op de console, dus het is moeilijk te ontdekken.

    Het bestand leek dit

    #!/usr/bin/perl
    ...
    

    Maar proberen om te draaien, ik krijg

    ./filename
    ./filename: line 1: #!/usr/bin/perl: No such file or directory
    

    Niet weergegeven, maar aan het begin van het bestand, is de 3 byte BOM. Voorzover linux is betrokken, wordt het bestand niet begint met #!

    De oplossing is

    vi filename
    :set nobomb
    :set fileencoding=utf-8
    :wq
    

    Dit verwijdert de BOM aan het begin van het bestand, zodat het juiste utf8.

    NB Windows maakt gebruik van de BOM om een tekst bestand als utf8, in plaats ANSI. Linux (en de officiële spec) niet.

    • Dank je de nobomb uitleg. Ik was aan het worstelen met dit probleem. Uiteindelijk heb ik gebruikt VIM. Bijvoorbeeld: vim +”ingesteld nobomb | set fenc=utf-8 “| x” TEST.CSV
  4. 0

    De geaccepteerde antwoord zal houden van het laatste bestand openen in Vim. Dit probleem kan eenvoudig worden opgelost met behulp van de -c optie van Vim,

    vim +"argdo set bomb | set fileencoding=utf-8 | w" -c ":q" file1.txt file2.txt
    

    Als u alleen de verwerking van een dossier, de volgende werken ook,

    vim -c ':set bomb' -c ':set fileencoding=utf-8' -c ':wq' file1.txt
    

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *