У меня была такая же проблема с посторонним мусором, добавленным Adobe в дампе EXIF. Я час искал прямой ответ и пробовал множество недоделанных предложений, которые здесь не сработали.
Эта тема, которую я читал больше, чем у большинства, которую я читал, была полна глубоких, проницательных вопросов типа «как он туда попал?», «Что, если у кого-то есть этот символ в его имени?», «Вы уверены, что хотите нарушить интернационализацию?» ?».
Было несколько впечатляющих проявлений эрудиции, показывающих, как этот мусор мог попасть сюда, и объясняющих эволюцию различных схем кодирования символов. Человек хотел знать, как его убрать, а не узнать, как он появился или какие у него стандарты, какими бы интересными ни были эти мелочи.
Я написал крошечную программу, которая дала мне правильный ответ. Вместо того, чтобы перефразировать основную концепцию, вот вся автономная работающая (по крайней мере, в моей системе) программа и вывод, который я использовал для уничтожения мусора:
#!/usr/local/bin/perl -w
# This runs in a dos window and shows the char, integer and hex values
# for the weird chars. Install the HEX values in the REGEXP below until
# the final test line looks normal.
$str = 's: “Brian'; # Nuke the 3 werid chars in front of Brian.
@str = split(//, $str);
printf("len str '$str' = %d, scalar \@str = %d\n",
length $str, scalar @str);
$ii = -1;
foreach $c (@str) {
$ii++;
printf("$ii) char '$c', ord=%03d, hex='%s'\n",
ord($c), unpack("H*", $c));
}
# Take the hex characters shown above, plug them into the below regexp
# until the junk disappears!
($s2 = $str) =~ s/[\xE2\x80\x9C]//g; # << Insert HEX values HERE
print("S2=>$s2<\n"); # Final test
Result:
M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl
len str 's: GÇ£Brian' = 11, scalar @str = 11
0) char 's', ord=115, hex='73'
1) char ':', ord=058, hex='3a'
2) char ' ', ord=032, hex='20'
3) char 'G', ord=226, hex='e2'
4) char 'Ç', ord=128, hex='80'
5) char '£', ord=156, hex='9c'
6) char 'B', ord=066, hex='42'
7) char 'r', ord=114, hex='72'
8) char 'i', ord=105, hex='69'
9) char 'a', ord=097, hex='61'
10) char 'n', ord=110, hex='6e'
S2=>s: Brian<
НОРМАЛЬНО !!!
Еще одно действенное, рабочее предложение, с которым я столкнулся:
iconv -c -t ASCII <6s-2014.1031-238246.halloween.exf.dif> exf.ascii.dif