• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved]Zeichenkodierung von Textdateien bestimmen

OsunSeyi

Hacker
Hallo !
Gibt es eine Möglichkeit (ein Programm), mit welchem ich mir die Zeichencodierung
von einer Textdatei (utf8, iso-8859-15) auf der Konsole ausgeben lassen kann ?
Um sie ggF direkt mit 'iconv' nach utf8 zu konvertieren.
Gruß, Tom
 

Leviathan

Hacker
Vlt. so:

CEST 13:44:22 root@nagios2 /usr/local/nagios> file test
test: UTF-8 Unicode text
CEST 13:44:23 root@nagios2 /usr/local/nagios> iconv -t iso-8859-15 test > test2
CEST 13:44:26 root@nagios2 /usr/local/nagios> file test2
test2: ISO-8859 text
CEST 13:44:29 root@nagios2 /usr/local/nagios>
 
"file" verfährt nur nach einer Heuristik. Es gibt keine Möglichkeit (mathematisch) definitiv zu sagen, dass eine Datei ISO-8859-1 oder ISO-8859-15, oder UTF-8 ist, denn jede UTF-8-Datei ist so ziemlich auch gültiges ISO-8859.
Und `iconv -f utf-8 -t iso-8859-15` sollte man schon angeben, sonst nimmt er vielleicht eben cp860 als Eingabeformat ;-)
 
OP
OsunSeyi

OsunSeyi

Hacker
Hallo!
Was daraus geworden ist...
Code:
#!/bin/sh
# Script, um alle Dateien eines Verzeichnisses (oder nach Modifikation
# auch der Unterverzeichnisse) als HTML-Datei mit Index anzuzeigen:
# Der verwendete Befehl HTML ist ein simples SED-Script, was Sonderzeichen usw in HTML umwandelt.
# ...kann man sich aber sparen, der Browser zeigt's auch ohne an.

datei="/home/tux/bin/text.htm"
temp="/home/tux/bin/text.tmp"

cd
echo "...lese /home/tux/"$1"/*"

# Kreiere HTML-Header:
echo "" > $temp
echo "<html><head><meta http-equiv='content-type' content='text/html; charset=ISO-8859'>" > $datei
echo "<title>"$1"</title></head><body><br><b>" >> $datei
echo "TEXTE in :" $1"/*<br>" >> $datei
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</b>" >> $datei

for i in $1/* ; do

  code=$(file $i | awk '{print $2}')
target=$(date +%N)

# UTF-8 kodierte Dateien werden nach ISO-8859-15 konvertiert:
       if [ "$code" = "UTF-8" ];
	then
		echo "<br><a href='#"$target"'>"$i"</a></b><br>     " >> $datei
		echo "<a name='"$target"'>   </a>" >> $temp
		echo "<br><b> >>> "$i"</b> (UTF-8)<br>" >> $temp    #Textvorschau:
		cat $i | iconv -s -f UTF-8 -t ISO-8859-15 2>/dev/null | HTML | tee -a $temp | sed 's/<br>/ /g' | tr -s xX~#_. | head -c 80 >> $datei
	fi

# ISO-8859 kodierte Dateien bleiben wie sie sind, Bilddateien etc werden nicht beruecksichtigt:
       if [ "$code" = "ISO-8859" ];
	then
		echo "<br><a href='#"$target"'>"$i"</a></b><br>     " >> $datei
		echo "<a name='"$target"'>   </a>" >> $temp    #Textvorschau:
		echo "<br><b> >>> "$i"</b> (ISO-8859)<br>" >> $temp
		cat $i | HTML | tee -a $temp | sed 's/<br>/ /g' | tr -s xX~#_. | head -c 80 >> $datei
	fi
done;

echo "<br><b>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</b><br>" >> $datei

# der Index wird direkt in $datei geschrieben, die dazugehörigen Texte angehaengt:
 cat $temp >> $datei
 echo "</body></html>" >> $datei

# oeffne mit Links-Browser:
 links $datei

########################### FIN ##############################################################################################
Frage 1: Sind solche Sachen pure Spielerei, auf die man bei besserer Kenntnis der Konsole bestens verzichten könnte ?
- 2: Geht´s auch eleganter ?
- 3: Warum kann ich als 1. Argument nicht auch zB ' Dokumente/*' übergeben ('/*' wird nicht übergeben, also $1='Dokumente')
Gruß, Tom
 
A

Anonymous

Gast
OsunSeyi schrieb:
Frage 1: Sind solche Sachen pure Spielerei, auf die man bei besserer Kenntnis der Konsole bestens verzichten könnte ?
- 2: Geht´s auch eleganter ?
- 3: Warum kann ich als 1. Argument nicht auch zB ' Dokumente/*' übergeben ('/*' wird nicht übergeben, also $1='Dokumente')

zu 1.
pure Spielerei sicherlich nicht, aber sehr gute Übungen in Shellprogramierung. Es gibt unzählige solcher Scripte im Netz ( aus purer Verzweiflung haben wohl schon mehrere sich ihr eigenes Script geschrieben :lol: ) und sicherlich auch einige hochkomplexe Programme oder Tools, die so was bestimmt auch könnten, wenn man nur aus den tausend Optionen die richtigen für sein Problem herausfinden könnte. :evil:
Die Frage ist, wo ist dein genaues Problem? Unterschiedliche Zeichencodierung in ein und dem selben Verzeichnis? (Wie passiert denn sowas?)

zu2.
vom Programmierstil bestimmt, prinzipiell kommt es auf dein genaues Problem an.
Ich benutze zB. hin und wieder mal etwas Ähnliches, um mich zB. bequemer durch Unmengen von Headerdateien zu navigieren.
Code:
enscript.bin -E --color --language=html --toc -p ausgabe.html   /usr/include/*.h && firefox ausgabe.html

zu3.
wenn du "Dokumente/*" als Argument übergibst, expantiert die Shell für jede passende Datei ein Argument. Du hast also dann nicht nur $1 sondern $1 $2 $3 $4 ......... ${!#} und die musst du dann nur entsprechend alle auswerten (zB mit "shift" durchschleifen) oder alle in einem Stück an ein Programm innerhalb deines Scriptes weitergeben. zB mit $* oder "$@"

robi
 
OP
OsunSeyi

OsunSeyi

Hacker
Hallo Robi
Also verschiedene Zeichensätze gibts hier, weil offenbar manche Programme danach verlangen, Zb
Pico produziert hier ISO und SED will das wohl auch so haben (bei Umlautersetzungen zB).
Wegen MS hab ich hier bisweilen auch ISO. Sonst ist alles UTF.
Im Prinzip würde ich gerne mehr auf der Konsole arbeiten, aber es fällt nicht leicht, sich im
Dateisystem so intuitiv zu bewegen wie auf der Graphik, warscheinlich eine Frage der Gewöhnung!
Das Script soll also ermöglichen, alle vorhandenen Schriftstücke auf einen Schlag anzuzeigen.
Um in einem Zug einen Überblick zu haben und auch alles in voller Länge lesen zu können, ohne
sich deswegen in Verzeichnissen rumsuchen zu müssen.
Übrigens suche ich einen Leitfaden für effektiveres Arbeiten auf der Konsole, der über die
Auflistung der Befehle hinausgeht sondern vielmehr eine Art Tips & Trick - Sammlung beinhalten
sollte. Falls Du was weißt...
PS vielen dank für den Tip, wird 'zu den Akten' genommen !
Gruß, Tom
 
Oben