Sto lavorando con stringhe che potrebbero contenere caratteri unicode sostitutivi (non BMP, 4 byte per carattere).Problema con caratteri unicode surrogati in F #
Quando uso il formato "\ Uxxxxxxxxv" per specificare il carattere surrogato in F # - per alcuni caratteri dà risultati diversi rispetto a C#. Per esempio:
C#:
string s = "\U0001D11E";
bool c = Char.IsSurrogate(s, 0);
Console.WriteLine(String.Format("Length: {0}, is surrogate: {1}", s.Length, c));
Dà: Length: 2, is surrogate: True
F #:
let s = "\U0001D11E"
let c = Char.IsSurrogate(s, 0)
printf "Length: %d, is surrogate: %b" s.Length c
Dà: Length: 2, is surrogate: false
Nota: alcuni caratteri surrogati funzionano in F # ("\ U0010011", "\ U00100011"), ma alcuni di essi non funzionano.
D: È un errore in F #? Come posso maniglia permesso caratteri Unicode surrogati in stringhe con F # (fa F # ha formato diverso, o solo il modo è quello di utilizzareChar.ConvertFromUtf32 0x1D11E
)
Aggiornamento:
s.ToCharArray()
dà per F # [| 0xD800; 0xDF41 |]
; per C# { 0xD834, 0xDD1E }
Questi sono metodi quadro in modo da non differiscono tra C# e F #. È come un bug del compilatore che gestisce la stringa letterale. Documenta cosa ottieni da s.ToCharArray(). –
1) Char.IsSurrogate ha 2 firme - la seconda consente di usare stringa e posizione; 2) * let s = '\ U0001D11E' * risulta nell'errore del compilatore – Vitaliy