F#中的代理unicode字符问题

Vit*_*liy 10 c# unicode f# surrogate-pairs

我正在使用字符串,它可能包含代理unicode字符(非BMP,每个字符4个字节).

当我使用" \ Uxxxxxxxxv "格式来指定F#中的代理字符时 - 对于某些字符,它给出的结果与C#的情况不同.例如:

C#:

string s = "\U0001D11E";
bool c = Char.IsSurrogate(s, 0);
Console.WriteLine(String.Format("Length: {0}, is surrogate: {1}", s.Length, c));
Run Code Online (Sandbox Code Playgroud)

得到: Length: 2, is surrogate: True

F#:

let s = "\U0001D11E"
let c = Char.IsSurrogate(s, 0)
printf "Length: %d, is surrogate: %b" s.Length c
Run Code Online (Sandbox Code Playgroud)

得到: Length: 2, is surrogate: false

注意:某些代理字符在F#("\ U0010011","\ U00100011")中有效,但其中一些不起作用.

问:这是F#中的错误吗?如何使用F#处理字符串中允许的代理unicode字符(F#有不同的格式,或者只有使用方式 Char.ConvertFromUtf32 0x1D11E)

更新:
s.ToCharArray()给出F#[| 0xD800; 0xDF41 |]; 对于C#{ 0xD834, 0xDD1E }

Bri*_*ian 7

这是VS2010(和SP1)附带的F#编译器中的已知错误; 修复程序出现在VS11位中,因此,如果您拥有VS11 Beta并使用F#3.0编译器,您将看到此行为符合预期.

(如果其他答案/评论在此期间没有为您提供合适的解决方法,请告诉我.)


And*_*y K 5

这显然意味着F#在解析一些字符串文字时会出错.事实证明,你提到的事实是非BMP,而在UTF-16中,它应该被表示为一对代理人.代理是0xD800-0xDFFF范围内的单词,而生成的字符串中的字符都不适合该范围.

但代理的处理并没有改变,因为框架(引擎盖下)是相同的.所以你已经在你的问题中得到了答案 - 如果你需要在代码中使用非BMP字符的字符串文字,你应该使用Char.ConvertFromUtf32而不是\ UXXXXXXXX表示法.所有其余的处理将始终如一.