【问题标题】:how does strlen count unicode in cstrlen如何计算c中的unicode
【发布时间】:2015-01-21 02:36:57
【问题描述】:

我很好奇 strlen 如何计算 C 中多个字节的 unicode 字符。

它是否计算每个字节或字符(因为它们可以由多个字节组成)直到第一个 '\0'?

【问题讨论】:

  • strlen 使用字节。并且某些 unicode 字符的第一个字节为 '0x00',因此 1) strlen 对于 unicode 字符串无用。 2) 有用于处理多字节字符的可用函数:您可能想要使用宽字符函数之一,例如在 string.h 和 wchar.h 或 mbstring.h 中定义的 _mbstrnlen() 或 wcsnlen

标签: c unicode count strlen


【解决方案1】:

strlen 仅适用于字符串,即char 的空终止数组。字符串中允许的所有多字节编码都具有不包含内部空字节的特性,因此strlen 和其他str 函数(例如strcat)可以正常工作。

如果你所说的“unicode”是指wchar_t 的数组,那么它可以包含空字节,但是这又没问题,wchar_t 元素本身都不会是空的。并且您不应该将 str 函数应用于此类数组,它们不是为它们定义的。

【讨论】:

    【解决方案2】:

    strlen() 计算字节数,直到遇到\0。这适用于所有字符串。

    对于 Unicode,请注意strlen() 的返回值可能会受到可能存在的\0 字节的影响,该字节位于除空终止符之外的有效字符中。如果使用 UTF-8,那很好,因为除了 ASCII 0 之外的任何有效字符都不能有 \0 字节,但对于其他编码可能不是这样。

    【讨论】:

    • 您确定 unicode 字符串与 \0 字符存在冲突吗?将提出一个新的相关问题!
    • 这取决于代码集。如果您使用的是 UTF-16,则诸如 U+00FF (ÿ) 之类的字符将由一个空字节和一个 0xFF 字节组成(以一种或另一种顺序,取决于字节序:UTF-16LE 或 UTF-16BE) ,并且空字节将在其轨道中停止strlen()。对于 UTF-32,每个 Unicode 字符都会出现问题,因为最大值是 U+10FFFF,这意味着在每个可能的 4 字节 Unicode 值中至少有一个零字节。 UTF-8 小心地避免了这个问题;只有当字符为 U+0000 时才会出现零字节。
    猜你喜欢
    • 2021-12-27
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多