如何将Unicode UCS-2格式的文本转换为C#可读格式?

3

我在SIM900 GPRS中收到了这条短信。

07916698019021F00410D05479BDDC7CBBCB790008217002123430826A0049006E0063006F00720072006500630074002000700061007300730077006F00720064002E00200050006C050610306500065060740507202079060750702007001070730700F0700402001060010600E02

另一条样本消息:

07916698019021F00410D05479BDDC7CBBCB790008217002025501826A0049006E0063006F00720072006500630074002000700061007300730077006F00720064002E00200050006C06001073050200506E04065070200906F07072020700607307007060020600006007060090600E

我认为这条消息是以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);

感谢您的提前帮助。

1
你为什么想要从像“U+0063”这样的字符串开始呢?难道不应该从二进制表示开始吗? - Jon Skeet
请参见以下回复:https://dev59.com/nnA75IYBdhLWcg3wKluM#25155746 - Behzad Ebrahimi
2个回答

4

我在维基百科上找到了这篇文章,它说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());

输出:Incorrect password. 密码错误。


感谢L.B,它可以使用可读文本。不正确的密码。P,鄇顦送,င哐뵹糜쮻y℈ɰ唂舁j,٬ကճ湐؄灐ठ牰܂怀ݳ瀀ɠ怀؇退๠。但是,我首先认为消息可能包含泰语而不是中文(也许)。 - embarus

0

尝试使用内置的System.Text.Encoding类。

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

编辑:您可以使用GetString(byte)将UCS-2/UTF-16编码转换。


感谢Akil W,但是它并没有按照我的预期工作。我从你的代码中得到了一组字节,但是当我试图将字节转换为字符串时,它显示相同的输入字符串。 - embarus
你可以将字节转换为十六进制。抱歉,我以为你试图将其转换为十六进制的字节表示 :) - darth10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接