如何在OCaml中创建lambda char?

Tai*_*Tai 2 ocaml utf-8

我想在OCaml中创建一个返回char lambda(UTF8 0x03bb)的函数,但是我不能使用,Char.chr因为它不在ASCII图表中。有办法吗?我是OCaml的新手...

Dan*_*zli 5

首先请注意,您要混合使用标量值(0..0xD7FF和0xE000 ..0x10FFFF范围内的整数)及其编码(此类整数的字节序列化)。不要说UTF-8 0x03bb,因为它没有任何意义,您要说的是标量值U + 03BB,它是表示Unicode中小lambda的整数。

现在,您已经注意到OCaml char类型不能表示这样的整数,因为它限制为256个值。但是,您可以做的是在OCaml字符串中表示它们的UTF-8 编码,这些字符串是(或更准确地说是)任意字节的序列。对于U + 03BB,其UTF-8序列化是字节序列,0xCE 0xBB因此您可以编写:

let lambda = "\xCE\xBB"
Run Code Online (Sandbox Code Playgroud)

如果您希望直接处理标量值,则可以使用UTF-8编码器,例如Uutf(免责声明,我是作者),例如:

let lambda = 0x03BB
let lambda_utf_8 =
   let b = Buffer.create 5 in
   Uutf.Buffer.add_utf_8 b lambda; Buffer.contents b
Run Code Online (Sandbox Code Playgroud)

有关Unicode的简短复习和有关如何在OCaml中处理Unicode的一些偏见,您可以查阅此最小的Unicode简介

更新

从OCaml 4.06开始,文字字符串支持Unicode转义。以下UTF-8对lambda字符串中的lambda字符进行编码:

let lambda = "\u{03BB}" 
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是您需要注意这一点:OCaml编译器正式只看到一个字节序列,这意味着不会检查这样的字符串的UTF-8有效性,并且可能会遇到* editor的UTF-8编码器中的错误。 *。使用转义heres可确保您在运行时具有正确的字节序列。 (2认同)