Dot-Net

代理對檢測失敗

  • July 26, 2018

我正在從事 F# 中的一個小型項目,該項目涉及將現有 C# 程式碼移植到 F#,我似乎遇到了兩種語言之間處理正則表達式的方式的差異(我發布這個希望發現我是只是做錯了什麼)。

這個次要函式使用此處概述的正則表達式技巧簡單地檢測代理對。這是目前的實現:

let isSurrogatePair input =
   Regex.IsMatch(input, "[\uD800-\uDBFF][\uDC00-\uDFFF]")

如果我然後對一個已知的代理對執行它,如下所示:

let result = isSurrogatePair "𠮷野𠮷"
printfn "%b" result

我進入falseFSI 視窗。

如果我使用等效的 C#:

public bool IsSurrogatePair(string input)
{
   return Regex.IsMatch(input, "[\uD800-\uDBFF][\uDC00-\uDFFF]");
}

和相同的輸入值,我(正確地)true返回。

這是一個真實的問題嗎?我只是在我的 F# 實現中做錯了嗎?

F# 如何對轉義的 Unicode 字元進行編碼似乎存在錯誤。

以下來自 F# Interactive(注意最後兩個結果):

> "\uD500".[0] |> uint16 ;;
val it : uint16 = 54528us
> "\uD700".[0] |> uint16 ;;
val it : uint16 = 55040us
> "\uD800".[0] |> uint16 ;;
val it : uint16 = 65533us
> "\uD900".[0] |> uint16 ;;
val it : uint16 = 65533us

幸運的是,這種解決方法有效:

> let s = new System.String( [| char 0xD800 |] )
s.[0] |> uint16
;;

val s : System.String = "�"
val it : uint16 = 55296us

基於這一發現,我可以建構一個更正(或者更確切地說,變通方法)的版本isSurrogatePair

let isSurrogatePair input =
 let chrToStr code = new System.String( [| char code |] )
 let regex = "[" + (chrToStr 0xD800) + "-" + (chrToStr 0xDBFF) + "][" + (chrToStr 0xDC00) + "-" + (chrToStr 0xDFFF) + "]"
 Regex.IsMatch(input,  regex)

此版本正確返回true您的輸入。

我剛剛在 GitHub 上送出了這個問題:https ://github.com/Microsoft/visualfsharp/issues/338

引用自:https://stackoverflow.com/questions/29359408