F# 如何将整数值转换为字符,例如97应打印为';a';

F# 如何将整数值转换为字符,例如97应打印为';a';,f#,F#,我有一个表示字符计数的整数值数组。 我想将字符值打印为一个字母,后跟计数 例如,将0数组成员作为字母“a”的计数,依此类推。从技术上讲,这个问题定义不足让f='a'是一个正确的答案。我们需要知道所需的编码。但我认为可以安全地假设您正在讨论以下编码之一,其中填充了前导零位: ASCII码 UTF-8 UTF-16 一些8b扩展ASCII变量 或者,如果您对.NET字符的确切含义有一个常见的误解,那么您可能指的是UTF-32。但不可能将UTF-32 int可以表示的所有字符转换为单个字符。cha

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


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

从技术上讲,这个问题定义不足
让f='a'
是一个正确的答案。我们需要知道所需的编码。但我认为可以安全地假设您正在讨论以下编码之一,其中填充了前导零位:

  • ASCII码
  • UTF-8
  • UTF-16
  • 一些8b扩展ASCII变量
或者,如果您对.NET字符的确切含义有一个常见的误解,那么您可能指的是UTF-32。但不可能将UTF-32 int可以表示的所有字符转换为单个字符。
char
类型实际上定义为UTF-16代码单元

不管怎样,如果我们不考虑使用的空间量,所有这些都将“a”编码为97

以下是一些工具:

  • 将数字输入转换为UTF-16,UTF-16是.NET中字符使用的内部编码
  • 查看和,了解各种解码工具,包括读取UTF-8
  • ASCII包含在Unicode代码点中,因此也可以通过上述方式进行转换–如果输入字符始终在ASCII范围内,即除最低有效7位外,所有字符均为零
  • 对于过时的、与区域性相关的8位编码,请查找适当的编码工具,类似于上文。尽管在这个时代使用它们是值得怀疑的
  • 从UTF-32获取最多包含两个字符的字符串
Vandroy的回答有一些相关的信息,但这里有一个简单的方法来完成你的要求


上面的代码效率很低,因为我正在从string转换为char数组,再转换为int数组,再转换回char。虽然在单个级别上,从char到int的转换是不可操作的,但这些函数调用中的每一个都会在数组上迭代,并创建一个新的数组,让GC处理旧的数组。这会造成内存流失。

使用
char 97
可以在阵列上映射函数。如果你展示一些代码,你会很容易知道怎么做。
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)|]