我有以下代码:
static Atom _NET_WM_NAME = XInternAtom( display, "_NET_WM_NAME", false );
unsigned char* wm_data = NULL;
Atom wm_type;
int wm_format;
unsigned long wm_nitems, wm_bytes;
std::string title;
int ret = XGetWindowProperty( display, window, _NET_WM_NAME, 0, 512,
false, utf8_string, &wm_type, &wm_format, &wm_nitems, &wm_bytes, &wm_data);
if( ret == Success && wm_nitems != 0 && wm_data != NULL ) {
title = (const char*)wm_data; // [1]
}
根据
spec
,
_NET_WM_NAME
属性是UTF8_STRING
因此,在我上面的代码中,
[1]
假设接收到的数据将始终以 NULL 终止。
代码是有效的,但返回的字节数 (wm_nitems
) 不包括 NULL 终止符,它始终与实际字符串长度相同。这就是让我不确定的原因。
所以我的问题是:
UTF8_STRING
属性将始终返回包含 NULL 终止符的字符串?wm_nitems
计数中?_NET_WM_NAME
属性是否正确?“XGetWindowProperty() 总是在 prop_return 中分配一个额外的字节(即使该属性的长度为零)并将其设置为零,这样由字符组成的简单属性在使用前不必复制到另一个字符串中。”
wm_nitems
:返回prop_return数据中存储的8位、16位或32位项的实际个数nitems_return
为什么要将空终止符算作数据。
XGetWindowProperty
自动返回一个以空结尾的字符串(见上文) 字符).
换句话说:
nul
也不算终止空字符,对吧?另一件事,C 字符串是 null
nul
是 null
指针,在 C 环境中具有特殊含义(参见:https://en.cppreference.com/w/c/types/NULL)。
strlen
NULL
'\0'
char
类型(实现定义,也可以是
NULL
)