7

只是浏览 digitalmars.D.learn 论坛和 StackOverflow 上与 D 相关的问题,在我看来,对于初学者 D 程序员(包括我)来说,一个主要的错误点是 char、wchar、dchar 的用法和能力的差异,以及相关的字符串类型。这会导致以下问题:

我知道这一定是出于向后兼容性的原因以及来自 C++ 或 C 的开发人员的熟悉程度,但我认为可以提出一个相当有说服力的论点,即这种可能的收益被这些开发人员在尝试一些不平凡的事情时遇到的问题所抵消使用charstring并期望它像在 C/C++ 中一样工作,只是让它以难以调试的方式失败。

为了避免很多这些问题,我看到 D 开发社区的有经验的成员一次又一次地告诉没有经验的编码人员使用dchar来避免这些问题,这引出了为什么char不是 32 位的问题默认情况下为 unicode 字符,8 位 ASCII 字符被降级为achar或类似的字符,仅在必要时才触摸?

4

3 回答 3

13

就个人而言,我希望那char不存在,而不是char, wchar, and dchar, 我们有一些更像utf8, utf16, and的东西utf32。然后每个人都会立即被迫意识到这char应该用于单个角色,但事实并非如此。我会说几乎可以肯定的情况char是简单地从 C/C++ 中提取,然后添加其他的以改进 Unicode 支持。毕竟,从根本上来说并没有什么问题char。只是很多程序员有这样的错误理解char总是一个字符(即使在 C/C++ 中也不一定是真的)。但是 Walter Bright 对 Unicode 有很好的理解,并且似乎认为其他人也应该如此,所以他倾向于做出关于 Unicode 的决定't(大多数程序员都不会)。D 几乎迫使你至少对 Unicode 有一个基本的了解,这并不全是坏事,但它确实让一些人感到不安。

但实际情况是,虽然dchar用于单个字符很有意义,但将其用于字符串通常没有意义。有时,这就是您所需要的,但 UTF-32 比 UTF-8 需要更多空间。这可能会影响性能,并且肯定会影响程序的内存占用。而且很多字符串处理根本不需要随机访问。因此,将 UTF-8 字符串作为默认值比将 UTF-32 字符串作为默认值更有意义。

在 D 中管理字符串的方式通常非常有效。只是这个名字char对很多人来说有一个不正确的含义,不幸的是,语言选择默认的字符文字char而不是dchar在很多情况下。

我认为可以提出一个相当有说服力的论点,即这种可能的收益被那些相同的开发人员所遇到的问题所抵消,当他们尝试使用 char 或 string 进行一些不平凡的事情并期望它像在 C/C++ 中一样工作时,只是为了让它以难以调试的方式失败。

实际情况是,C/C++ 中的字符串与 D 中的工作方式相同,只是它们不能保护您免于无知或愚蠢,这与 D 不同。char在 C/C++ 中始终是 8 位,通常是操作系统将其视为 UTF-8 代码单元(至少在 *nix 领域 - Windows 为编码做了一些奇怪的事情,char并且通常要求您使用wchar_tUnicode)。当然,您在 C/C++ 中拥有的任何 Unicode 字符串都是 UTF-8 格式,除非您明确使用使用不同编码的字符串类型。std::string和 C 字符串都对代码单元而不是代码点进行操作。但是普通的 C/C++ 程序员将它们视为每个元素都是一个完整的字符,除非您只使用 ASCII,否则这是完全错误的,而在当今时代,这通常是一个非常糟糕的假设。

D 采取了在语言及其标准库中实际构建适当的 Unicode 支持的路线。这迫使您至少对 Unicode 有一个基本的了解,并且通常会使其更难搞砸,同时为那些理解它的人提供非常强大的工具,不仅可以正确而且有效地管理 Unicode 字符串。C/C++ 只是绕过这个问题,让程序员踩到 Unicode 地雷。

于 2012-11-13T21:36:19.803 回答
2

我将问题理解为“为什么默认情况下不在字符串中使用 dchar?”

dchar 是一个 UTF-32 编码单元。您很少希望处理 UTF-32 代码单元,因为您浪费了太多空间,尤其是当您只处理 ASCII 字符串时。

使用 UTF-8 代码单元(D 中的适当类型是 char)更节省空间。

D 字符串是一个immutable(char)[],即 UTF-8 代码单元的数组。

是的,如果您经常对字符串进行随机访问,可以说处理 UTF-32 代码单元可能会提高应用程序的速度。但是,如果您知道要对某些特定文本执行此操作,请dstring在这种情况下使用类型。这就是说,您现在应该明白为什么 D 将字符串视为 dchar 范围。

于 2012-11-14T10:33:33.957 回答
0

由于组合字符,甚至dchar不能真正保存所有 Unicode 字符(以人类想要的任何方式)并且不能直接索引(参见本文末尾的示例)。

于 2012-11-14T14:55:25.730 回答