Почему мои персидские SMS отправляют неверные символы в режиме PDU, используя кодирование UCS2?C#

Место общения программистов C#
Ответить
Anonymous
 Почему мои персидские SMS отправляют неверные символы в режиме PDU, используя кодирование UCS2?

Сообщение Anonymous »

Я пытаюсь отправить персидские SMS -получателю, используя модемы GSM и режим PDU с кодированием UCS2. Сообщение SMS находится в персидском тексте ("سلام"), а номер получателя - 0777220xxx. Тем не менее, полученное сообщение показывает неверные символы, такие как ㌆䐆✆ вместо ожидаемого персидского текста. < /P>
Вот код, который я использую для отправки SMS: < /p>
public void SendSms(string recipientNumber, string messageText)
{
try
{
SerialPort port = new SerialPort();
port.PortName = "COM9"; // Make sure this is correct
port.BaudRate = 9600;
port.Parity = Parity.None;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Handshake = Handshake.None;
port.ReadTimeout = 5000;
port.WriteTimeout = 5000;

port.Open();

// Set to UCS2 character set
port.WriteLine("AT+CSCS=\"UCS2\"\r");
Thread.Sleep(1000);
string response = port.ReadExisting();
MessageBox.Show("Modem response UCS2: " + response, "Response", MessageBoxButtons.OK, MessageBoxIcon.Information);

// Set SMS mode to PDU (0 = PDU mode)
port.WriteLine("AT+CMGF=0\r");
Thread.Sleep(1000);
response = port.ReadExisting();
MessageBox.Show("Modem response Text Mode: " + response, "Response", MessageBoxButtons.OK, MessageBoxIcon.Information);

// Convert Persian message to PDU format
string pduMessage = ConvertToPduFormat(recipientNumber, messageText);

// Get PDU length (without SCA part)
int pduLength = (pduMessage.Length / 2) - 1;

// Send the PDU command
port.WriteLine($"AT+CMGS={pduLength}\r");
Thread.Sleep(1000);
response = port.ReadExisting();
MessageBox.Show("Modem response send pdu: " + response, "Response", MessageBoxButtons.OK, MessageBoxIcon.Information);

// Send the actual PDU data
port.Write(pduMessage + "\r");
Thread.Sleep(1000);

// Send Ctrl+Z (ASCII 26) to submit SMS
port.Write(new byte[] { 26 }, 0, 1);
Thread.Sleep(5000);

// Read response
response = port.ReadExisting();
MessageBox.Show("Modem response send message: " + response, "Response", MessageBoxButtons.OK, MessageBoxIcon.Information);

if (response.Contains("ERROR"))
{
MessageBox.Show("Send Failed!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
MessageBox.Show("Message Sent Successfully!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
SaveMessageToDatabase(recipientNumber, messageText);
}

port.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

public static string ConvertToPduFormat(string recipientNumber, string message)
{
// Convert Persian text to UCS2 (UTF-16 Big Endian)
byte[] ucs2Bytes = Encoding.BigEndianUnicode.GetBytes(message); // Use BigEndianUnicode for UCS2
string hexMessage = BitConverter.ToString(ucs2Bytes).Replace("-", "");

// Convert phone number to international format (remove leading 0)
if (recipientNumber.StartsWith("0"))
{
recipientNumber = "+93" + recipientNumber.Substring(1); // Example for Afghanistan (+93)
}

// Convert phone number to semi-octet format
string pduPhoneNumber = ConvertPhoneNumberToSemiOctets(recipientNumber);

// PDU Header
string pduHeader = "0001000B91" + pduPhoneNumber + "0008" + hexMessage;

return pduHeader;
}

private static string ConvertPhoneNumberToSemiOctets(string phoneNumber)
{
string semiOctets = "";
if (phoneNumber.StartsWith("+"))
{
phoneNumber = phoneNumber.Substring(1);
}

for (int i = 0; i < phoneNumber.Length; i += 2)
{
if (i + 1 < phoneNumber.Length)
{
semiOctets += phoneNumber[i + 1].ToString() + phoneNumber.ToString();
}
else
{
semiOctets += "F" + phoneNumber.ToString(); // Add "F" padding if needed
}
}
return semiOctets;
}

< /code>
Проблема: Когда я отправляю сообщение SMS "سلام" номеру 077722xxx, получатель получает его как ㌆䐆✆ вместо правильного персидского текста. < /p>
Я установил набор символов на UCS2, используя команду AT+CSCS = "UCS2".
Я преобразую персидское сообщение в формат UCS2 (UTF-16 Big Endian), а затем преобразую номер телефона в полу-полу -octet format.
Я отправляю сообщение с помощью режима PDU с командой AT+CMGF = 0 и как я могу исправить эту проблему, чтобы правильно отправить персидский текст?

Подробнее здесь: https://stackoverflow.com/questions/794 ... cs2-encodi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»