我正在處理字符串,它可能包含代理unicode字符(非BMP,每個字符4字節)。問題與代理unicode字符在F#
當我使用「\ 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#中的錯誤嗎?我該如何處理允許代理Unicode字符與F#的字符串(不F#有不同的格式,或僅方法是使用Char.ConvertFromUtf32 0x1D11E
)
更新:
s.ToCharArray()
給出了F#[| 0xD800; 0xDF41 |]
; for C#{ 0xD834, 0xDD1E }
這些框架的方法,所以不要C#和F#之間的差異。 Quacks就像一個處理字符串文字的編譯器錯誤。記錄你從s.ToCharArray()中獲得的內容。 – 2012-04-12 13:12:59
1)Char.IsSurrogate有2個簽名 - 第二個允許使用字符串和位置; 2)* let s ='\ U0001D11E'*導致編譯器錯誤 – Vitaliy 2012-04-12 13:20:05