如何在Visual C中获取多字节字符串的字节大小?有功能还是我必须自己计算角色?
或者,更一般地说,如何获得TCHAR字符串的正确字节大小?
解决方案:
_tcslen(_T("TCHAR string")) * sizeof(TCHAR)
编辑:
我只讨论以空字符结尾的字符串。
答案 0 :(得分:9)
让我们看看我是否可以解决这个问题:
“多字节字符串”是一个模糊的术语,但在微软的世界中,它通常意味着“不是ASCII,而不是UTF-16”。因此,您可能正在使用某些字符编码,每个字符可能使用1个字节,或2个字节,或者可能更多。一旦这样做,字符串中的字符数!=字符串中的字节数。
我们以UTF-8为例,即使它没有在MS平台上使用。字符é在内存中编码为“c3 a9” - 因此,两个字节,但是1个字符。如果我有字符串“thé”,那就是:
text: t h é \0
mem: 74 68 c3 a9 00
这是一个“空终止”字符串,因为它以null结尾。如果我们想让我们的字符串中包含空值,我们需要以其他方式存储大小,例如:
struct my_string
{
size_t length;
char *data;
};
......以及一系列有助于解决这个问题的功能。 (这类似于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
这是UTF-16中的“thé”,存储在小端(这是典型的桌面)。注意所有的00字节 - 这些都是strlen。因此,我们调用wcslen
,它将其视为2字节short
,而不是单字节。
最后,您有TCHAR
s,这是上述两种情况之一,具体取决于是否定义了UNICODE
。 _tcslen
将是适当的功能(strlen
或wcslen
),TCHAR
将是char
或wchar_t
。创建TCHAR
是为了便于在Windows世界中迁移到UTF-16。
答案 1 :(得分:3)
_tcslen
被定义时, According to MSDN,strlen
对应_MBCS
。 strlen
将返回字符串中 bytes 的数量。如果您使用与_tcsclen
对应的_mbslen
,它会返回多字节字符的数量。
此外,多字节字符串不包含(AFAIK)嵌入的空值,没有。
我首先会质疑使用多字节编码,但是......除非你支持遗留应用程序,否则没有理由在Unicode上选择多字节。