Special characters such as &, *, @, $ etc has different values in GSM 7 bit encoding. You need to check the character en-coding supported by your SMSC. Some SMSC uses ISO 8859-2 Latin character set instead of GSM7 bit. In case of mismatch of character encoding, such special characters in message may not appear properly on mobile handset. Question mark (?) may appear instead of regular value.
In 99.9 % cases, it may be encoding issue. Its better to debug the PDU using wireshark and send it to your SMSC, for speedy resolution.