А iconv и не угадывает. Он работает строго как скажешь. Автоматом, вот тебе:
#!/bin/sh
dos2unix | (IFS=""; while read line; do echo $line | konwert any/ru-koi8r; done;)
На stdin даёшь файл с разными кодировками в разных строчках, на stdout получаешь нормальный русский язык (в koi8-r -- у меня в терминале до сих пор koi8, поправь на ту кодировку, что нужна тебе).
Пример, скрипт для генерации файла с разными кодировками:
#!/bin/sh
echo "10 SIN ; REM Текст на русском языке" | iconv -t cp866
echo "20 GOTO HELL ; REM Албанский комментарий" | iconv -t cp1251
Пример декодирования файла:
sysop@pc$ cat file.txt
10 SIN ; REM ╔╙АБ ╜═ ЮЦАА╙╝╛ О╖К╙╔
20 GOTO HELL ; REM юКАЮМЯЙХИ ЙНЛЛЕМРЮПХИ
sysop@pc$ cat conv.sh
#!/bin/sh
dos2unix | (IFS=""; while read line; do echo $line | konwert any/ru-koi8r; done;)
sysop@pc$ sh conv.sh < file.txt
10 SIN ; REM Текст на русском языке
20 GOTO HELL ; REM Албанский комментарий
Для всего этого нужна программа konwert (пакеты konwert и konwert-filters в дебиане). Возможно, это она (
http://sourceforge.net/projects/konwert/), если не она, то исходники есть в дебиане опять же. У этой программы есть функция угадывания кодировки (для файла целиком, потому мне пришлось скриптом разделить файл на строки).