Unicode代码点转换中的“语言处理”?

时间:2016-03-08 09:26:03

标签: c# .net unicode char

Char.ConvertFromUtf32州的MSDN文档:

  

基本多语言平面(BMP)之外的有效代码点始终产生有效的代理项对。 但是,根据Unicode标准,BMP中的有效代码点可能无法生成有效结果,因为转换中不使用语言处理。因此,请使用System.Text :: UTF32Encoding类将批量UTF-32数据转换为批量UTF-16数据。

上面提到的“语言处理”是什么?是否有Char.ConvertFromUtf32(i)[0]次呼叫可能会为{BMP +中的字符(char)i提供不同的结果?

1 个答案:

答案 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;

(我省略了与此讨论无关的各种代码行)