【问题标题】:宽字符/字符串对 C 程序的影响
【发布时间】: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 作为宽字符串

标签: c wchar-t widechar wchar


【解决方案1】:

为什么我的程序中的每个字符串都会占用两倍的字节,不应该只是我们声明为存储 wchar_t 类型的字符数组吗?

据我了解,这意味着如果您有一个使用char * 的程序,而现在您重写该程序以使用wchar_t *那么它将使用(超过) 两倍的字节数。

【讨论】:

  • 是的,我也这么想。我们在同一页上,对吧?如果我没有声明一个宽的字符串,那么我没有使用宽的内存分配,对吗?
  • If I don't declare a string to be wide, then I am not using he memory allocation of wide, correct? 是的。
【解决方案2】:

如果字符串可能包含超出 ascii 范围的字符,则必须将其声明为宽字符串。所以程序中的大多数字符串都会更大。就个人而言,我不会担心。如果你需要 Unicode,你就需要 Unicode,再多几个字节也不会害死你。

这似乎是你的意思,我同意。但问题是在固执己见和客观之间划清界限。

【讨论】:

  • If a string could potentially contain a character outside of the ascii range, you'll have to declare it as a wide string 这根本不是真的。您可以将任何带有 UTF-8 的 Unicode 字符存储在普通字符串中。现在甚至Windows supports the UTF-8 locale
  • @phuclv 从逻辑上讲,您将如何解释? 128 字节表示中没有足够的字节来保存 unicode 值。我的问题指的是 windows 编程,但主要关注的是C 是如何处理它的,而不是windows api。
  • @mindoverflow C 没有 Unicode 支持,除了一些 wchar_t 功能远非完整的 Unicode 支持。 There just aren't enough bytes in a 128 byte representaton to hold unicode values 这没有意义。 ASCII 是一个 7 位字符集,可以表示 128 个不同的值,而不是 128 字节。我不明白你在说什么。简而言之,UTF-8 是一种变长编码,其中一个码位可以用 1 到 4 个字节来表示
  • @mindoverflow:utf-8 是一种可变长度的多字节编码。任何 Unicode 字符都可以使用 1 到 4 个字节来表示,其中 1 个字节的代码对应于 128 个 Ascii 代码。 C 对 UTF-8 的支持最少;任何有趣的事情,例如确定代码序列的长度,都必须明确地或使用 3rd 方库来完成。 C 中没有表示单个 UTF-8 序列的原始数据类型;通常,序列被转换为单个整数。
  • 所有这些都不是批评。我强烈建议使用 UTF-8 进行数据交换。有优秀的 unicode 库。但是你需要有适当的期望:-)。 Windows 的问题是在系统 API 中使用 Unicode 字符串,例如文件路径。在那里,您需要查阅 Windows 文档。请参阅上面 phuclv 第一条评论中的链接。
【解决方案3】:

Unicode 有一些类型:utf8、utf16 utf32。 https://en.wikipedia.org/wiki/Unicode。 您可以检查它们的优势,劣势,以了解您应该使用什么情况。

参考:UTF-8, UTF-16, and UTF-32

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多