La diferencia principal es que tenías un while() innecesario donde creabas variables temporales, también innecesarias y había la posibilidad de errores en caso de no encontrar el registro buscado.
Ahora, lo único que podría hacer que
json_encode() no codifique correctamente ese texto es que no esté en utf-8 y, si es el caso, necesitas usar utf8_encode() o iconv() para corregir el error.