【发布时间】:2022-01-23 10:29:05
【问题描述】:
以下是 Charles Petzold
的旧版Programming Windows一书的摘录当然,使用 Unicode 也有一些缺点。首先也是最重要的一点是程序中的每个字符串都将占用两倍的空间。此外,您将观察到宽字符运行时库中的函数 比通常的函数大。
为什么我的程序中的每个字符串都会占用两倍的字节,不仅仅是我们声明为存储wchar_t类型的字符数组吗?
是否可能存在某种条件,即如果程序要能够使用 Long 值,那么它将改变其运行的整个程序模式?
通常,如果我们声明一个 long int,我们不会大惊小怪或提及所有 ints 现在将占用双倍内存的事实。字符串是某种特殊情况吗?
【问题讨论】:
-
我相信这个假设是关于 Windows API 函数的。那些采用字符串参数的函数的 W 版本将需要宽字符串。这可能是 100% 的字符串或 1%,这取决于程序。
-
wchar_t 的大小不像 C 中的其他类型那样固定,但通常在 Windows 上它是 2 字节长,在 Unix 上它是 4 字节长
-
@phuclv 你现在在这里提出了一些有趣的东西。我一直都知道一个普通的 char 代表 1 个字节,一个宽的代表 2。在 x86 中,int 是 4 个字节,long 是 8 个字节,long long 是 16;就这样,也许 UNIX 考虑到了 UTF-32 而不是 UTF-8 的存储方式?
-
@RetiredNinja 是的,这就是我所相信的。只要它不关闭 MRI 机器,我想我可以忍受使用宽字符。我相信现在的大多数系统都不会因此而成为问题
-
@mindoverflow
char在 C 中至少有 8 位,因此char可以表示具有 32 位char的平台上的所有 Unicode 字符。在 UCS-4 时代之前,Windows 只是 Unicode 的早期采用者,因此它使用现在是 UTF-16 的子集的 UCS-2。 Unix 在 Unicode 世界中出现的时间要晚得多,并且使用 UTF-8 作为窄字符串以实现向后兼容性,但我不知道他们为什么选择 UTF-32 作为宽字符串