Я пытаюсь отправить персидские 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
Почему мои персидские SMS отправляют неверные символы в режиме PDU, используя кодирование UCS2? ⇐ C#
Место общения программистов C#
1739008496
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[i].ToString();
}
else
{
semiOctets += "F" + phoneNumber[i].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 и как я могу исправить эту проблему, чтобы правильно отправить персидский текст?
Подробнее здесь: [url]https://stackoverflow.com/questions/79422927/why-is-my-persian-sms-sending-incorrect-characters-in-pdu-mode-using-ucs2-encodi[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия