嗨,我正在尝试转换包含特殊字符(例如// set schema when instantiating manager
const manager = connection.createEntityManager({ schema: tenantDomain });
// should find all matching "order" entities within schema
const orders = manager.find(Order, { priority: 4 })
// should find a matching "item" entity within schema using same manager
const item = manager.findOne(Item, { id: 321 })
和û
)的字符串。
在研究和测试中,我几乎成功使用了以下功能:
…
如果我尝试对public static string ToHex(this string input)
{
char[] values = input.ToCharArray();
string hex = "0x";
string add = "";
foreach (char c in values)
{
int value = Convert.ToInt32(c);
add = String.Format("{0:X}", value).Length == 1 ?
"0" + String.Format("{0:X}", value) + "00"
: String.Format("{0:X}", value) + "00";
hex += add;
}
return hex;
}
进行解码,它将正确执行并将其转换为´o¸sçPQ^ûË\u000f±d
,
相反,当我尝试解码0xB4006F00B8007300E700500051005E00FB00CB000F00B1006400
时,它会失败并变成´o¸sçPQ](ÂF\u0012…a
而不是它
0xB4006F00B8007300E700500051005D002800C200460012002026006100
。
进行最少的调试,我看到字符串从
0xB4006F00B8007300E700500051005D002800C2004600120026206100
到´o¸sçPQ](ÂF\u0012…a
,我不希望这成为问题,但我不确定。
编辑
´o¸sçPQ](ÂF.a
在此先感谢您的答复或评论,
问候。
答案 0 :(得分:2)
这是由于endianness以及不同的整数和字符串编码所致。
char cc = '…';
Console.WriteLine(cc);
// 2026 <-- note, hex value differs from byte representation shown below
Console.WriteLine(((int)cc).ToString("x"));
// 26200000
Console.WriteLine(BytesToHex(BitConverter.GetBytes((int)cc)));
// 2620
Console.WriteLine(BytesToHex(Encoding.GetEncoding("utf-16").GetBytes(new[] { cc })));
您不应将char视为整数。有很多不同的方式来编码字符串,.net内部使用UTF-16。并且所有编码都使用字节,而不是整数。将字符显式转换为整数会导致意外的结果,就像您一样。为什么没有获得所需的编码并通过Encoding.GetBytes
处理字节?
void Main()
{
// output you expect 0xB4006F00B8007300E700500051005D002800C2004600120026206100
Console.WriteLine(BytesToHex(Encoding.GetEncoding("utf-16").GetBytes("´o¸sçPQ](ÂF\u0012…a")));
}
public static string BytesToHex(byte[] bytes)
{
// whatever way to convert bytes to hex
return "0x" + BitConverter.ToString(bytes).Replace("-", "");
}