我正在使用字符串,它可能包含代理 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 }