9

如何在 Visual C 中获取多字节字符串的字节大小?有功能还是我必须自己数字符?

或者,更一般地说,如何获得 TCHAR 字符串的正确字节大小?

解决方案:

_tcslen(_T("TCHAR string")) * sizeof(TCHAR)

编辑:
我只是在谈论以空字符结尾的字符串。

4

2 回答 2

10

让我们看看我是否可以解决这个问题:

“多字节字符串”一开始是一个模糊的术语,但在微软的世界里,它通常意味着“不是 ASCII,也不是 UTF-16”。因此,您可以使用一些字符编码,每个字符可能使用 1 个字节,或 2 个字节,或者可能更多。一旦你这样做,字符串中的字符数!=字符串中的字节数。

让我们以 UTF-8 为例,即使它没有在 MS 平台上使用。字符 é 在内存中被编码为“c3 a9”——因此是两个字节,但只有 1 个字符。如果我有字符串“thé”,它是:

text: t  h  é     \0
mem:  74 68 c3 a9 00

这是一个“空终止”字符串,因为它以空结尾。如果我们想让我们的字符串中包含空值,我们需要以其他方式存储大小,例如:

struct my_string
{
    size_t length;
    char *data;
};

...以及一系列功能来帮助解决这个问题。(这有点像std::string工作原理,非常粗略。)

但是,对于以 null 结尾的字符串,将以字节而不是字符为单位strlen()计算它们的大小。(还有其他计算字符的函数)只是在它看到 0 字节之前计算字节数——没什么特别的。strlen

现在,MS 世界中的“wide”或“unicode”字符串指的是 UTF-16 字符串。他们有类似的问题,字节数!=字符数。(另外:字节数 / 2 != 字符数)让我们再看一遍:

text:   t      h      é      \0
shorts: 0x0074 0x0068 0x00e9 0x0000
mem:    74 00  68 00  e9 00  00 00

那是 UTF-16 中的“thé”,以小端序存储(这是您的典型桌面)。注意所有的 00 字节——这些字节跳到 strlen 上。因此,我们将wcslen其称为 2 字节short,而不是单个字节。

最后,您有TCHARs,它是上述两种情况之一,具体取决于是否UNICODE定义了。_tcslen将是适当的函数(要么 要么strlenwcslen,并且TCHAR要么char要么wchar_tTCHAR旨在简化 Windows 世界中向 UTF-16 的迁移。

于 2010-07-29T00:08:39.847 回答
3

根据 MSDN_tcslen对应于strlenwhen_MBCS被定义。strlen将返回字符串中的字节数。如果使用_tcsclen,则返回对应_mbslen的多字节字符数。

此外,多字节字符串(AFAIK)不包含嵌入的空值,不。

不过,我首先会质疑多字节编码的使用……除非您支持旧版应用程序,否则没有理由选择多字节而不是 Unicode。

于 2010-07-28T23:53:37.187 回答