【发布时间】:2012-04-24 19:51:44
【问题描述】:
我正在处理字符串,它可能包含代理 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));
给:Length: 2, is surrogate: True
F#:
let s = "\U0001D11E"
let c = Char.IsSurrogate(s, 0)
printf "Length: %d, is surrogate: %b" s.Length c
给:Length: 2, is surrogate: false
注意:某些代理字符在 F# 中有效(“\U0010011”、“\U00100011”),但其中一些无效。
问:这是 F# 中的错误吗?如何使用 F# 处理字符串中允许的代理 unicode 字符(F# 是否有不同的格式,或者唯一的方法是使用 Char.ConvertFromUtf32 0x1D11E)
更新:s.ToCharArray() 为 F# [| 0xD800; 0xDF41 |] 提供;对于 C#{ 0xD834, 0xDD1E }
【问题讨论】:
-
这些是框架方法,因此在 C# 和 F# 之间没有区别。嘎嘎声就像处理字符串文字的编译器错误。记录你从 s.ToCharArray() 中得到的结果。
-
1) Char.IsSurrogate 有 2 个签名 - 第二个允许使用字符串和位置; 2) let s = '\U0001D11E' 导致编译器错误
标签: c# unicode f# surrogate-pairs