2016-11-21 46 views

回答

5

從技術上來說,這個問題尚未定義。 let f _ = 'a'將是一個正確的答案。我們需要知道所需的編碼。但是,我認爲它是安全的假設,你在談論以下編碼之一,充滿了領先的零位:

  • ASCII
  • UTF-8
  • UTF-16
  • 一些8B擴展的ASCII變體

或者,如果您對什麼是.NET字符有一個普遍的誤解,那麼可能是UTF-32。但是不可能將UTF-32 int可以表示的所有字符轉換爲單個字符。 char類型實際上定義爲UTF-16代碼單元。

無論如何,如果我們忽略使用的空間量,所有這些將'a'編碼爲97。

這裏有一些工具:

  • char數字輸入轉換爲UTF-16,其是由在.NET字符使用的內部編碼。
  • 查看System.Text namespaceSystem.Text.Encoding各種解碼工具,包括讀取UTF-8。
  • ASCII包含在Unicode代碼點中,因此也可以通過上述方式進行轉換 - 如果輸入字符始終在ASCII內,即除了最低有效位7位都置零。
  • 對於過時的,與文化相關的8位編碼,尋找合適的編碼工具,與上面類似。儘管在當今時代使用它們是有問題的。
  • System.Char.ConvertFromUtf32從UTF-32獲取最多兩個字符的字符串。
2
let str = "Hello World!" 

// Convert to an int array and group by key. 
let count_array = 
    str.ToCharArray() 
    |> Array.map int 
    |> Array.groupBy id // Groups them by ints 
    // Since the ints are the same in this case, we convert the array length to counts. 
    // We also convert k back to char. 
    |> Array.map (fun (k,ar) -> char k, ar.Length) 

printfn "%A" count_array 

// [|('H', 1); ('e', 1); ('l', 3); ('o', 2); (' ', 1); ('W', 1); ('r', 1); ('d', 1); 
// ('!', 1)|] 

通過Vandroiy答案有一些相關的信息,但在這裏是做你問一個簡單的方法。

上面的代碼是低效的,因爲我從字符串轉換爲char數組到int數組並返回char。雖然在從char轉換爲int的單個級別上是無操作的,但是每個這些函數調用都會遍歷數組,並創建一個新的函數並將其留給GC來處理舊數組。這會造成記憶流失。

相關問題