I assume you are on Linux box and the files were made on a Windows box. Linux uses UTF-8 as the character encoding for filenames, while Windows uses something else. I think this is the cause of the problem.
I would use "convmv". This is a tool that can convert filenames from one character encoding to another. For Western Europe one of these normally works:
convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .
If you need to install it on a Debian based Linux you can do so by running:
sudo apt-get install convmv
It works for me every time and it does recover the original filename.
Source: LeaseWebLabs
cp -r /mnt/broken_but_mountable_old_flash_disk/ /some/dir
can actually happen very easily leading to undeletable files. To save time trying, the perl answer below does work on those: serverfault.com/a/348496/327691