如何将整数值转换为char,例如97应打印为'a'

时间:2016-11-21 11:31:34

标签: f#

我有一个表示字符数的整数值数组。 我想将字符值打印为字母后跟计数

例如,0数组成员作为字母'a'的计数,依此类推。

2 个答案:

答案 0 :(得分: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最多两个字符的字符串。

答案 1 :(得分: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来处理旧的。这会造成内存流失。