如何获取多字节字符串的字节大小

fla*_*acs 8 c string size character-encoding multibyte

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

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

解:

_tcslen(_T("TCHAR string")) * sizeof(TCHAR)
Run Code Online (Sandbox Code Playgroud)

编辑:
我只讨论以空字符结尾的字符串.

Tha*_*tos 9

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

"多字节字符串"是一个模糊的术语,但在微软的世界中,它通常意味着"不是ASCII,而不是UTF-16".因此,您可能正在使用某些字符编码,每个字符可能使用1个字节,或2个字节,或者可能更多.一旦这样做,字符串中的字符数!=字符串中的字节数.

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

text: t  h  é     \0
mem:  74 68 c3 a9 00
Run Code Online (Sandbox Code Playgroud)

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

struct my_string
{
    size_t length;
    char *data;
};
Run Code Online (Sandbox Code Playgroud)

......以及一系列有助于解决这个问题的功能.(这有点像是std::string有效的,非常粗略.)

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

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

text:   t      h      é      \0
shorts: 0x0074 0x0068 0x00e9 0x0000
mem:    74 00  68 00  e9 00  00 00
Run Code Online (Sandbox Code Playgroud)

这是UTF-16中的"thé",存储在小端(这是典型的桌面).注意所有的00字节 - 这些都是strlen.因此,我们调用wcslen,将其视为2字节shorts,而不是单字节.

最后,你有TCHARs,它是上述两种情况之一,具体取决于是否UNICODE已定义._tcslen将是适当的函数(strlen或者wcslen),TCHAR或者是char或者wchar_t.TCHAR旨在简化Windows世界中UTF-16的迁移.


Dea*_*ing 2

根据 MSDN_tcslen对应于定义的strlen时间。将返回字符串中的字节数。如果使用对应的which 返回多字节字符数。_MBCSstrlen_tcsclen_mbslen

另外,多字节字符串不(据我所知)包含嵌入的空值,不。

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