Try to quote the variable in the first echo too, that should preserve all blanks and tabs. The newline characters are lost in the outer loop, because you read the input file line by line and the terminating newline is not written to the variable by read.
You need to set IFS to "" to tell read to not break arguments on whitespace. This property is occasionally useful -- if you set IFS="," you can read in values delimited by commas instead of space-separated ones...
Note I don't set IFS globally anywhere here, since you usually expect it to break on whitespace.
So, to make your program work:
#!/bin/bash
cat leerfichero.sh | while IFS="" read linea
do
echo ""
echo "$linea" | while IFS="" read -n 1 caracter
do
echo -n "$caracter"
done
done