Как преобразовать текст в формате Unicode UCS-2 в читаемый с C #?

Я получаю это сообщение в SMS на SIM900 GPRS.

07916698019021F00410D05479BDDC7CBBCB790008217002123430826A0049006E0063006F00720072006500630074002000700061007300730077006F00720064002E00200050007C0506103065007007007007007007000700070007000700700700700700700700700700700700070070007

И еще один пример сообщения:

07916698019021F00410D05479BDDC7CBBCB790008217002025501826A0049006E0063006F00720072006500630074002000700061007300730077006F00720064002E00200050006C06001073050650650700700700730506507007007007007007305065070067070

Я думаю, что это сообщение в формате Unicode UCS-2 на тайском языке. Однако я не могу преобразовать его во что-то читаемое. Я нашел очень полезный код:

//Here's how you'd go from a string to stuff like
// U+0053 U+0063 U+006f
string scott = "ฉ";
foreach (char s in scott) {
  Console.Write("{0:x4} ", (int)s);
}
//Here's how converted a string (assuming it starts with U+)
// containing the representation of a char
// back to a char
// Is there a built in, or cleaner way? Would this work in Chinese?
string maybeC = "U+0063";
int p = int.Parse(maybeC.Substring(2),
 System.Globalization.NumberStyles.HexNumber);
Console.WriteLine((char)p);

Заранее спасибо.


person embarus    schedule 20.07.2012    source источник
comment
Зачем вам начинать с такой строки, как U + 0063? Разве вы не должны начать с двоичного представления?   -  person Jon Skeet    schedule 20.07.2012
comment
См. Также следующий ответ: stackoverflow.com/a/25155746/638977   -  person Behzad Ebrahimi    schedule 31.08.2014


Ответы (2)


Читая в Википедии, я нашел эту статью, в которой говорится, что UCS-2 очень похож на UTF-16. Так:

string s = "07916698019021F00410D05479BDDC7CBBCB790008217002025501826A0049006E0063006F00720072006500630074002000700061007300730077006F00720064002E00200050006C06001073050200506E04065070200906F07072020700607307007060020600006007060090600E";
List<byte> bytes = new List<byte>();
for (int i = 0; i < s.Length; i+=2)
{
    bytes.Add(byte.Parse(s.Substring(i, 2), NumberStyles.HexNumber));
}

var str = Encoding.Unicode.GetString(bytes.ToArray());

ВЫХОД: 鄇顦送င哐뵹糜쮻y℈ɰ唂舁jIncorrect password. P٬ကճ湐؄灐ठ牰܂怀ݳ瀀ɠ怀؇退

person L.B    schedule 20.07.2012
comment
Спасибо L.B, он работает с читаемым текстом 鄇 顦 送  င 哐 뵹 y℈ɰ 唂 舁 jНеверный пароль. P ٬ က ճ 湐 ؄ 灐 ठ 牰܂ 怀 ݳ 瀀 ɠ ؇ 退 ๠ Однако я сначала думаю, что сообщение может состоять из тайского, а не китайского (возможно). - person embarus; 20.07.2012

Попробуйте использовать встроенный класс System.Text.Encoding.

using System.Text;
// ..
var bytes = Encoding.GetEncoding("ucs-2").GetBytes("SomeString");

Изменить: вы можете конвертировать из кодировки UCS-2 / UTF-16 с GetString(byte).

person darth10    schedule 20.07.2012
comment
Спасибо Акилу В, но он работает не так, как я ожидал. Я получаю массив байтов из вашего кода, но когда я пытаюсь преобразовать байт в строку, он показывает ту же строку ввода. - person embarus; 20.07.2012
comment
Вы можете преобразовать байты в шестнадцатеричный. Извините, я предположил, что вы пытаетесь преобразовать байтовое представление в шестнадцатеричное :) - person darth10; 20.07.2012