Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sonderzeichen UTF-8 in Datei

21 views
Skip to first unread message

Ekkart Kleinod

unread,
Apr 29, 2013, 5:58:21 AM4/29/13
to
Hi alle,

ich habe ein Problem mit Sonderzeichen bei Nutzung von UTF-8 und dem
Schreiben/Lesen in eine Datei.

Kurz: ich schreiben einen Namen in eine Datei, lese ihn ein und in der
tabbing-Umgebung verhält sich mein Konstrukt seltsam, nicht für
"normale" Umlaute wie "ä", sondern für "é". Das "é" wird nicht korrekt
ausgegeben.

Kann das jemand erklären und, wenn möglich, eine Lösung finden, wie das
umgangen werden kann?

Ich füge ein Minimalbeispiel an, wer sich für den konkreten Fehler
interessiert, mein changes-Paket hat Probleme mit Autoren mit Umlauten,
da bricht die ganze Änderungsliste zusammen:

<https://raw.github.com/habi/latex/master/changes-bug.tex>

Danke, Ekkart.

Minimalbeispiel:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

% Schreiben
\makeatletter
\newwrite\TestOutFile
\immediate\openout\TestOutFile = test.out
\let\Testprotect\protect
\let\protect\@unexpandable@protect
\immediate\write\TestOutFile{a;Hägar;bb}
\immediate\write\TestOutFile{b;Sébastien;bb}
\immediate\closeout\TestOutFile
\let\protect\Testprotect
\makeatother

% auseinanderschneiden
\def\TestChopline#1;#2;#3 \\{
\def\TestFirst{#1}
\def\TestSecond{#2}
\def\TestThird{#3}
}

\begin{document}
\newread\TestInFile
\openin\TestInFile = test.out
\read\TestInFile to \TestLine
\TestLine
\expandafter\TestChopline\TestLine\\

\TestSecond

\begin{tabbing}
Name:m\=\kill
Name:\>\TestSecond\\
\end{tabbing}


\read\TestInFile to \TestLine
\TestLine
\expandafter\TestChopline\TestLine\\

\TestSecond

\begin{tabbing}
Name:m\=\kill
Name:\>\TestSecond\\
\end{tabbing}

\closein\TestInFile
\end{document}

Ulrike Fischer

unread,
Apr 29, 2013, 8:57:26 AM4/29/13
to
Am Mon, 29 Apr 2013 11:58:21 +0200 schrieb Ekkart Kleinod:

> Hi alle,
>
> ich habe ein Problem mit Sonderzeichen bei Nutzung von UTF-8 und dem
> Schreiben/Lesen in eine Datei.
>
> Kurz: ich schreiben einen Namen in eine Datei, lese ihn ein und in der
> tabbing-Umgebung verh�lt sich mein Konstrukt seltsam, nicht f�r
> "normale" Umlaute wie "�", sondern f�r "�". Das "�" wird nicht korrekt
> ausgegeben.
>
> Kann das jemand erkl�ren und, wenn m�glich, eine L�sung finden, wie das
> umgangen werden kann?

Die Tabbing-Umgebung definiert \' um (und auch \` und \=). Die
Akzente m�ssen als \a'e eingegeben werden.

Du k�nntest die Namen so in die externe Datei schreiben:

\immediate\write\TestOutFile{\unexpanded{S�bastien}}

Dann ist test.out nat�rlich nicht mehr eine reine ASCII-Datei,
sondern enth�lt utf8-Buchstaben..

--
Ulrike Fischer
http://www.troubleshooting-tex.de/

Ekkart Kleinod

unread,
Apr 29, 2013, 10:22:59 AM4/29/13
to
On 29.04.2013 14:57, Ulrike Fischer wrote:

> Die Tabbing-Umgebung definiert \' um (und auch \` und \=). Die
> Akzente müssen als \a'e eingegeben werden.

Ah.

> Du könntest die Namen so in die externe Datei schreiben:
>
> \immediate\write\TestOutFile{\unexpanded{Sébastien}}
>
> Dann ist test.out natürlich nicht mehr eine reine ASCII-Datei,
> sondern enthält utf8-Buchstaben..

ok, kann ich probieren. Anderenfalls verzichte ich auf die
tabbing-Umgebung (mal sehen).

Danke für die Erläuterung,

Gruß, Ekkart.

Rolf Niepraschk

unread,
Apr 29, 2013, 10:26:34 AM4/29/13
to
Am 29.04.2013 16:22, schrieb Ekkart Kleinod:
...
>
> ok, kann ich probieren. Anderenfalls verzichte ich auf die
> tabbing-Umgebung (mal sehen).
>

Sieh Dir mal das Paket "tabto" an. Es ist in der Anwendung ähnlich,
macht aber keine solchen Probleme.

...Rolf


Ulrich D i e z

unread,
Apr 29, 2013, 10:26:10 AM4/29/13
to
Ulrike Fischer schrieb:

> Du k�nntest die Namen so in die externe Datei schreiben:
>
> \immediate\write\TestOutFile{\unexpanded{S�bastien}}
>
> Dann ist test.out nat�rlich nicht mehr eine reine ASCII-Datei,
> sondern enth�lt utf8-Buchstaben..

Falls - wie auf einer meiner Uralt-Plattformen, bei der das
Problem auch mit latin1-encoding statt utf8 auftritt -
keine eTeX-extensions und damit auch kein \detokenize
zur Verf�gung stehen/steht, kann man zur Not auch mit
\@onelevel@sanitize arbeiten:

\def\phrase{b;S�bastien;bb}%
\@onelevel@sanitize\phrase
\immediate\write\TestOutFile{\phrase}

Ulrich

Ekkart Kleinod

unread,
Apr 30, 2013, 4:26:15 AM4/30/13
to
hmm. Ich würde (im Rahmen des changes-Pakets) so wenig wie möglich
Zusatzpakete einbinden wollen und sehe es nicht als Problem an, wenn die
Hilfsdatei UTF-8-Zeichen enthält. Das muss ja sowieso eingestellt werden.

Aber evtl. brauche ich das Paket ja ein andermal.

Danke, Gruß, Ekkart.

Ekkart Kleinod

unread,
Apr 30, 2013, 4:27:06 AM4/30/13
to
On 29.04.2013 16:26, Ulrich D i e z wrote:
> Ulrike Fischer schrieb:
>
>> Du könntest die Namen so in die externe Datei schreiben:
>>
>> \immediate\write\TestOutFile{\unexpanded{Sébastien}}
>
> Falls - wie auf einer meiner Uralt-Plattformen, bei der das
> Problem auch mit latin1-encoding statt utf8 auftritt -
> keine eTeX-extensions und damit auch kein \detokenize
> zur Verfügung stehen/steht, kann man zur Not auch mit
> \@onelevel@sanitize arbeiten:

ok, aber ich denke, da nehme ich die Nicht-Not-Variante und hoffe, nicht
allzuviele Nutzer damit zu verlieren :)

Danke, Ekkart.

Ekkart Kleinod

unread,
May 2, 2013, 4:06:41 AM5/2/13
to
On 29.04.2013 14:57, Ulrike Fischer wrote:
> Am Mon, 29 Apr 2013 11:58:21 +0200 schrieb Ekkart Kleinod:
>
> Du könntest die Namen so in die externe Datei schreiben:
>
> \immediate\write\TestOutFile{\unexpanded{Sébastien}}
>
> Dann ist test.out natürlich nicht mehr eine reine ASCII-Datei,
> sondern enthält utf8-Buchstaben..

ok, das funktioniert sehr gut.

Bis auf :), dass ich die Namen nicht direkt schreibe, sondern über
namedef definiert habe.
Jetzt schreibt er den namedef-Befehl in die Datei, nicht den Namen.

Wie kann ich das umgehen?

Vielen Dank,

Ekkart.

Beispiel:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter
\@namedef{Testname}{Hägar}
\newwrite\TestOutFile
\immediate\openout\TestOutFile = test.out
\let\Testprotect\protect
\let\protect\@unexpandable@protect
\immediate\write\TestOutFile{\unexpanded{Hägar};\@nameuse{Testname};}
\immediate\write\TestOutFile{\unexpanded{Hägar};\unexpanded{\@nameuse{Testname}};}
\immediate\closeout\TestOutFile
\let\protect\Testprotect
\makeatother

\begin{document}
\newread\TestInFile
\openin\TestInFile = test.out
\read\TestInFile to \TestLine
\TestLine

\read\TestInFile to \TestLine
\TestLine
\closein\TestInFile
\end{document}

Ulrike Fischer

unread,
May 2, 2013, 5:43:31 AM5/2/13
to
Am Thu, 02 May 2013 10:06:41 +0200 schrieb Ekkart Kleinod:
>> Du k�nntest die Namen so in die externe Datei schreiben:

>> \immediate\write\TestOutFile{\unexpanded{S�bastien}}

>> Dann ist test.out nat�rlich nicht mehr eine reine ASCII-Datei,
>> sondern enth�lt utf8-Buchstaben..

> ok, das funktioniert sehr gut.

> Bis auf :), dass ich die Namen nicht direkt schreibe, sondern �ber
> namedef definiert habe.
> Jetzt schreibt er den namedef-Befehl in die Datei, nicht den Namen.

> Wie kann ich das umgehen?

Du musst den Befehl halt oft genug expandieren:

\immediate\write\TestOutFile{%
\unexpanded\expandafter\expandafter\expandafter{\csname
Testname\endcsname}}

Ekkart Kleinod

unread,
May 2, 2013, 7:06:37 AM5/2/13
to
ok, da lag ich mit meinem Versuch, expandafter einzubauen, gar nicht so
falsch. Hab's halt nur einmal versucht. Das kommt davon, wenn man etwas
versucht, was man nicht wirklich versteht.

Vielen Dank,

Gruß, Ekkart.
0 new messages