c/c++语言开发共享如何获取多字节字符串的字节大小

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

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

解:

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

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

    根据MSDN , _tcslen在定义_tcslen对应于strlenstrlen将返回字符串中的字节数。 如果使用与_tcsclen对应的_mbslen ,它返回多字节字符数

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

    我首先会质疑多字节编码的使用,但是……除非你支持遗留应用程序,否则没有理由在Unicode上选择多字节。

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

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

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

     text: th é  mem: 74 68 c3 a9 00 

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

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

    ……以及一系列有助于解决这个问题的function。 (这有点像std::string工作方式,非常粗略。)

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

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

     text: th é  shorts: 0x0074 0x0068 0x00e9 0x0000 mem: 74 00 68 00 e9 00 00 00 

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

    最后,您有TCHAR ,这是上述两种情况之一,具体取决于是否定义了UNICODE_tcslen将是适当的函数( strlenwcslen ), TCHAR将是charwchar_t 。 创建TCHAR是为了简化Windows世界中UTF-16的迁移。

      以上就是c/c++开发分享如何获取多字节字符串的字节大小相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560521.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐