将 UTF-16 字节数组编码为字符串字符 C# .NET
Encoding a UTF-16 Byte Array into a string character C# .NET
我有一个字节数组,我相信它正确地存储了 unicode 字符的 UTF-16 编码代理对
运行 通过 .Net System.Text.Encoding.Unicode.GetString()
returns 非预期结果的字节数组。
实际结果:��
预期结果:
代码示例:
byte[] inputByteArray = new byte[4];
inputByteArray[0] = 0x91;
inputByteArray[1] = 0xDF;
inputByteArray[2] = 0x00;
inputByteArray[3] = 0xD8;
// System.Text.Encoding.Unicode accepts little endian UTF-16
// Least significant byte first within the byte array [0] MSByete in [3]
string str = System.Text.Encoding.Unicode.GetString(inputByteArray);
// This returns �� rather than the excpected symbol:
Console.WriteLine(str);
关于我如何从字符获取特定字节数组的详细信息:
此字符在补充多语言平面内。这个字符在 Unicode 中是 0x10391。编码为 UTF-16 代理对,这应该是:
用 0x10000 减去 Unicode 值:val = 0x00391 = (0x10391 - 0x10000)
高代理项:0xD800 = ( 0xD800 + (0x00391 >> 10 ))
前 10 位
低代理项:0xDF91 = (0xDC00 + (0x00391 & 0b_0011_1111_1111))
后 10 位
Encoding.Unicode
是基于 每个 UTF-16 代码单元 的小端。您仍然需要将高代理项代码单元放在低代理项代码单元之前。这是有效的示例代码:
using System;
using System.Text;
class Test
{
static void Main()
{
byte[] data =
{
0x00, 0xD8, // High surrogate
0x91, 0xDF // Low surrogate
};
string text = Encoding.Unicode.GetString(data);
Console.WriteLine(char.ConvertToUtf32(text, 0)); // 66449
}
}
我有一个字节数组,我相信它正确地存储了 unicode 字符的 UTF-16 编码代理对
运行 通过 .Net System.Text.Encoding.Unicode.GetString()
returns 非预期结果的字节数组。
实际结果:��
预期结果:
代码示例:
byte[] inputByteArray = new byte[4];
inputByteArray[0] = 0x91;
inputByteArray[1] = 0xDF;
inputByteArray[2] = 0x00;
inputByteArray[3] = 0xD8;
// System.Text.Encoding.Unicode accepts little endian UTF-16
// Least significant byte first within the byte array [0] MSByete in [3]
string str = System.Text.Encoding.Unicode.GetString(inputByteArray);
// This returns �� rather than the excpected symbol:
Console.WriteLine(str);
关于我如何从字符获取特定字节数组的详细信息:
此字符在补充多语言平面内。这个字符在 Unicode 中是 0x10391。编码为 UTF-16 代理对,这应该是:
用 0x10000 减去 Unicode 值:val = 0x00391 = (0x10391 - 0x10000)
高代理项:0xD800 = ( 0xD800 + (0x00391 >> 10 ))
前 10 位
低代理项:0xDF91 = (0xDC00 + (0x00391 & 0b_0011_1111_1111))
后 10 位
Encoding.Unicode
是基于 每个 UTF-16 代码单元 的小端。您仍然需要将高代理项代码单元放在低代理项代码单元之前。这是有效的示例代码:
using System;
using System.Text;
class Test
{
static void Main()
{
byte[] data =
{
0x00, 0xD8, // High surrogate
0x91, 0xDF // Low surrogate
};
string text = Encoding.Unicode.GetString(data);
Console.WriteLine(char.ConvertToUtf32(text, 0)); // 66449
}
}