13

我目前正在探索Digital Mars D语言的规范,并且在理解原始字符类型的完整性质时遇到了一些麻烦。《Learn to Tango With D 》一书同样模糊了该语言在该领域的能力和局限性。

网站上给出的类型如下:

字符;// 未签名的 8 位 UTF-8
wchar; // 无符号 16 位 UTF-16
字符;// 无符号 32 位 UTF-32

由于我们知道大多数 Unicode 转换 (UTF) 格式编码表示具有可变位宽的字符,这是否意味着 D 中的 char 只能包含适合 8 位的值,或者它是否在机器的给它双字节字符时的物理内存?也许还有其他一些可能性,比如在重载变量时自动转换为下一个最合适的类型?

例如,我想在编辑器中使用 UTF-8 字符并输入 Chinese 。它会简单地摔倒,还是能够更“正确”地处理 Unicode 字符,就像在 C# 中一样?是否仍然需要提供胶水代码以允许使用 Unicode 支持的任何语言?

我希望您能提供有关这些类型如何在幕后工作的任何具体信息,以及有关处理其局限性的任何一般最佳实践建议。

4

1 回答 1

15

单个charorwchar表示一个 UTF代码单元。这意味着,就其本身而言,a charin 既可以表示 ASCII 符号 (0-127),也可以是表示 Unicode 字符(代码点)的 UTF-8 序列的一部分。只有dchar类型可以表示整个 Unicode 字符,因为 Unicode 中有超过 65536 个代码点。

转换一种字符串类型(和string,它们只是字符类型的动态数组)不会自动将它们的内容转换为相应的 UTF 表示形式。为此,您必须使用函数和from (或/ / from,如果您使用 Tango)。wstringdstringtoUTF8toUTF16toUTF32std.utftoStringtoString16toString32tango.text.convert.Utf

用户已经实现了字符串类,它将自动使用最节省内存的表示形式,可以将每个字符映射到单个代码单元。这允许以最小的内存开销快速切片和索引。一种这样的实现是Christopher E. Miller 的mtext

进一步阅读:

于 2009-07-12T18:06:06.527 回答