gpt4 book ai didi

character-encoding - 为什么 dchar 不是 D 中的标准字符类型?

转载 作者:行者123 更新时间:2023-12-04 10:09:11 25 4
gpt4 key购买 nike

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

  • error instantiating redBlackTree template
  • Cannot Slice Take!R from std.range in D?
  • std.algorithm.joiner(string[],string) - why result elements are dchar and not char?

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

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

    最佳答案

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

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

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

    I think a fairly compelling argument can be made that this possible gain is offset by the problems experienced by those same developers when they try something non-trivial with a char or string and expect it to work as it would in C/C++, only to have it fail in difficult-to-debug ways.



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

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

    关于character-encoding - 为什么 dchar 不是 D 中的标准字符类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13368728/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com