Проблема с суррогатными символами Юникода в F#

Я работаю со строками, которые могут содержать суррогатные символы юникода (не 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));

Дает: Длина: 2, суррогат: True

F#:

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

Дает: Длина: 2, суррогат: false

Примечание: Некоторые суррогатные символы работают в F# ("\U0010011", "\U00100011"), но некоторые из них не работают.

В: Является ли это ошибкой в ​​F#? Как я могу обрабатывать разрешенные суррогатные символы Юникода в строках с помощью F# (у F# другой формат или только способ использоватьChar.ConvertFromUtf32 0x1D11E)

Обновление:
s.ToCharArray() дает для F# [| 0xD800; 0xDF41 |]; для C# { 0xD834, 0xDD1E }

10
задан Andriy K 13 April 2012 в 13:03
поделиться