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

标签 c string character-encoding size multibyte

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

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

解决方法:

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

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

最佳答案

让我们看看我能否解决这个问题:

“多字节字符串”一开始是一个模糊的术语,但在微软的世界里,它通常意味着“不是 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() 将计算它们的大小以字节为单位,而不是字符。 (还有其他用于计算字符的函数)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,这是上述两种情况之一,具体取决于是否定义了 UNICODE_tcslen 将是适当的函数(strlenwcslen),而 TCHAR 将是 char wchar_tTCHAR 的创建是为了简化 Windows 世界中向 UTF-16 的迁移。

关于c - 如何获取多字节字符串的字节大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358442/

相关文章:

c - pthread_cond_signal 会通知哪个线程?

c++ - [ '(' token 之前的预期标识符或 '{' 错误]

javascript - jquery:将[object Object]附加到字符串

c - 为什么我的串行通信不工作?

c - 提升fopen/fclose场景下的性能

php - 比较两个字符串并以百分比计算它们之间的差异(php)

android - 无法在android中对字符串数组进行排序,Arrays.sort导致致命异常

python - 如何打开包含 Unicode 字符的 html 文件?

matlab - matlab中的阿拉伯语短信

java - 如何使用 apache httpclient fluent 4.3.2 在请求中设置字符集