When you know that you are dealing with international character sets (e.g. Unicode) then always remember that you are looking "through a glass, darkly."
"The output" "is garbled" it would seem be-cause it is being displayed to you in the wrong character-set: an English character-set, not Thai. But the bytes might well not be "garbled" or "incorrect" at all! In fact they probably are not.
If you send a string to the unidecode() function, do you know that the bytes are the same? Most likely they are not ... you're sending it a quoted character-string which means that some decoding is going to happen to produce "the bytes."
You have got to get straight to the computer's level ... to a stream of bytes.