in reply to
How to convert grabled characters into their real value
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.