Char.ConvertFromUtf32
州的MSDN文档:
基本多语言平面(BMP)之外的有效代码点始终产生有效的代理项对。 但是,根据Unicode标准,BMP中的有效代码点可能无法生成有效结果,因为转换中不使用语言处理。因此,请使用System.Text :: UTF32Encoding类将批量UTF-32数据转换为批量UTF-16数据。
上面提到的“语言处理”是什么?是否有Char.ConvertFromUtf32(i)[0]
次呼叫可能会为{BMP +中的字符(char)i
提供不同的结果?
答案 0 :(得分:1)
for (int i = 0; i < 65535; i++)
{
char ch1 = (char)i;
if (i < 0x0d800 || i > 0xdfff)
{
string str1 = char.ConvertFromUtf32(i);
if (str1.Length != 1)
{
Console.WriteLine("\\u+{0:x4}: char.ConvertFromUtf32(i).Length = {1}", i, str1.Length);
}
char ch2 = str1[0];
if (ch1 != ch2)
{
Console.WriteLine("\\u+{0:x4}: (char)i = 0x{1:x4}, char.ConvertFromUtf32(i)[0] = 0x{2:x4}", i, (int)ch1, (int)ch2);
}
}
byte[] bytes = BitConverter.GetBytes(i);
string str2 = Encoding.UTF32.GetString(bytes);
if (str2.Length != 1)
{
Console.WriteLine("\\u+{0:x4}: Encoding.UTF32.GetString(bytes).Length = {1}", i, str2.Length);
}
char ch3 = str2[0];
if (ch1 != ch3)
{
Console.WriteLine("\\u+{0:x4}: (char)i = 0x{1:x4}, Encoding.UTF32.GetString(bytes)[0] = 0x{2:x4}", i, (int)ch1, (int)ch3);
}
}
唯一的区别似乎是在0xd800 - 0xdfff范围内,char.ConvertFromUtf32()
将引发异常,而Encoding.UTF32.GetString()
将返回无效字符的0xfffd。
在reference source上,我们可以清楚地看到UTF32字符没有“特殊处理”。
if (iChar >= 0x10000)
{
*(chars++) = GetHighSurrogate(iChar);
iChar = GetLowSurrogate(iChar);
}
// Add the rest of the surrogate or our normal character
*(chars++) = (char)iChar;
(我省略了与此讨论无关的各种代码行)