Variablen gibt es nicht, aber Makros. Man kann nun einfach ein neues Makro definieren, das den expandierten Inhalt eines anderes Makros enthält:
\newcommand\LastInputEncoding{}% irgendwo in der Präambel
% ...
\edef\LastInputEncoding{\inputencodingname}
\inputencoding{foo}
% Hier beliebiger Code
\inputencoding{\LastInputEncoding}
Schöner wird es natürlich, wenn man richtiges logisches Markup dafür definiert (ungetestet):
% Irgendwo in der Präambel:
\makeatletter
\newcommand*{\inputencodingstack}{}
\newcommand*{\pushinputencoding}{%
\xdef\inputencodingstack{{\inputencodingname}{\inputencodingstack}}%
}
\newcommand*{\popinputencoding}{%
\expandafter\pop@inputencoding\inputencodingstack\@empty\@empty}%
\newcommand*{\pop@inputencoding}[2]{%
\xdef\inputencodingstack{#2}%
\inputencoding{#1}%
}
\usepackage[latin1]{inputenc}% oder welche Codierung auch immer
% ...
% Und dann irgendwo im Dokument
\pushinputencoding
\inputencoding{utf8}
% Hier irgendwas in der angegebenen Codierung
\popinputencoding
% Und hier geht es in der ursprünglichen Codierung weiter.
Wenn ich keinen Fehler gemacht habe, kann man die Codierung beliebig schachteln. Wenn man zu viele Pop-Anweisungen verwendet, meckert \inputencoding wegen einer nicht definierten Codierung. Wenn ich einen Fehler gemacht habe, funktioniert gar nichts.
Da \xdef im Gegensatz zu \edef nicht im Wiki zu finden ist, sei erwähnt, dass \xdef einfach nur ein \global\edef ist, also auch über die aktuele Gruppe hinaus wirkt. Ich halte das an der Stelle für besser.