读取 UTF8_STRING 类型的 X11 属性是否保证以 NULL 结尾?

问题描述 投票:0回答:1

我有以下代码:

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 终止符,它始终与实际字符串长度相同。这就是让我不确定的原因。

所以我的问题是:

  1. 保证读取
    UTF8_STRING
    属性将始终返回包含 NULL 终止符的字符串?
  2. 如果是这样,为什么 NULL 终止符不包括在
    wm_nitems
    计数中?
  3. 有人可以指出规范中指定的位置吗?
  4. 特别是,上面的代码片段对于读取
    _NET_WM_NAME
    属性是否正确?
x11 xlib icccm
1个回答
1
投票

XGetWindowProperty

“XGetWindowProperty() 总是在 prop_return 中分配一个额外的字节(即使该属性的长度为零)并将其设置为零,这样由字符组成的简单属性在使用前不必复制到另一个字符串中。”


wm_nitems

nitems_return
:返回prop_return数据中存储的8位、16位或32位项的实际个数

为什么要将空终止符算作数据。

XGetWindowProperty
自动返回一个以空结尾的字符串(见上文)
 字符).
换句话说:
nul

也不算终止空字符,对吧?

另一件事,C 字符串是 

null
终止的字符数组。符号

nulnull

 指针,在 C 环境中具有特殊含义(参见:
https://en.cppreference.com/w/c/types/NULL)。

strlen
    是类型
  • NULL
    
    
    '\0'
  • char
     类型(实现定义,也可以是 
    NULL
        
© www.soinside.com 2019 - 2024. All rights reserved.