D语言中原始字符类型有哪些限制?

13

我目前正在研究Digital Mars D语言的规范,对于原始字符类型的完整性质有些困惑。在书籍Learn to Tango With D中,该领域的语言能力和限制也难以理解。

网站上给出了以下类型:

char;    // 无符号 8 位 UTF-8
wchar;   // 无符号 16 位 UTF-16
dchar;   // 无符号 32 位 UTF-32

由于我们知道大多数Unicode Transformation(UTF)格式编码使用可变位宽表示字符,那么D中的char是否只能包含适合8位的值,或者当给定双字节字符时会在机器的物理内存中扩展?或者还有其他可能性,例如在重载变量时自动转换为下一个最合适的类型?

比如说,如果我想在编辑器中使用UTF-8 char输入中文,它会简单地崩溃吗?还是可以像C#一样更“正确”地处理Unicode字符?仍然需要提供粘合代码以允许使用Unicode支持的任何语言吗?

如果您能提供有关这些类型在底层如何工作以及处理它们限制的任何通用最佳实践建议,我将不胜感激。


"由于我们知道Unicode标准使用可变位宽来表示字符" -> 你是指UTF-8吗? - elcuco
是的,我指的是UFT编码。对于造成的混淆,我很抱歉。 - Ian Gilham
1个回答

15
一个单独的 charwchar 代表一个 UTF 码元。这意味着,单独一个 char 可以表示 ASCII 符号 (0-127),或者是 Unicode 字符 (码点) 的 UTF-8 序列的一部分。只有 dchar 类型可以表示整个 Unicode 字符,因为 Unicode 中有超过 65536 个的码点。
将一种类型的字符串类型 (string, wstring, 和 dstring, 它们都是字符类型的动态数组) 强制转换并不会自动将它们的内容转换成相应的 UTF 表示。为了实现此目的,必须使用来自 std.utf 的函数 toUTF8, toUTF16, 和 toUTF32 (如果你使用 Tango,也可以使用 tango.text.convert.Utf 中的 toString, toString16, 和 toString32 函数)。
用户们已经实现了字符串类,它们将自动使用最节省内存的表示方式,使每个字符映射到一个单独的码元。这样可以快速地对字符串进行分割和索引,同时最小化内存开销。其中一个实现是由 Christopher E. Miller 实现的 mtext
更多阅读:

2
看起来,我的问题在于理解代码单元和代码点之间的区别。最后一个链接非常好地解释了一切。谢谢。 - Ian Gilham
对Keep先生的写作进行赞扬,我也表示赞同。 - BCS
1
很高兴听到这篇文章对你有所帮助。不过,CyberShadow在我之前回答了这个问题,真是让人气愤! :P - DK.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接