我正在为我的正在播放插件获取Spotify的窗口标题功能:
GetWindowText(spotify_window_handle, title, title_length)
但输出包含替换字符\ uFFFD。
Ex. Spotify - Killswitch Engage � One Last Sunset
如何用C替换 ?
完整代码:
char* spotify_title(int window_handle)
{
int title_length = GetWindowTextLength(window_handle);
if(title_length != 0)
{
char* title;
title = (char*)malloc((++title_length) * sizeof *title );
if(title != NULL)
{
GetWindowText(window_handle, title, title_length);
if(strcmp(title, "Spotify") != 0)
{
return title;
}
else
{
return "Spotify is not playing anything right now. Type !botnext command to restart playback.";
}
}
else
{
printf("PLUGIN: Unable to allocate memory for title\n");
}
free(title);
}
else
{
printf("PLUGIN: Unable to get Spotify window title\n");
}
}
// End of Spotify get title function
答案 0 :(得分:1)
在Unicode-> Ansi转换期间使用替换字符。在没有看到实际声明title
的方式(是使用char
还是wchar_t
?)的情况下,我的猜测是你正在调用GetWindowText()
的Ansi版本(又名{{1}窗口标题包含一个Unicode字符,无法在操作系统的默认Ansi语言环境中表示,因此在将窗口文本转换为Ansi进行输出时,GetWindowTextA()
将替换该字符。请记住,Windows实际上是基于Unicode的操作系统,因此您应该使用Unicode版GetWindowTextA()
(又名GetWindowText()
),例如:
GetWindowTextW()
或者:
WCHAR title[256];
int title_length = 256;
GetWindowTextW(spotify_window_handle, title, title_length);
或者至少确保您的项目配置为针对Unicode进行编译,以便在编译期间定义int title_length = GetWindowTextLengthW(spotify_window_handle);
LPWSTR title = (LPWSTR) malloc((title_length+1) * sizeof(WCHAR));
GetWindowTextW(spotify_window_handle, title, title_length+1);
...
free(title);
和UNICODE
。这会使_UNICODE
映射到GetWindowText()
而不是GetWindowTextW()
。然后,您必须将GetWindowTextA()
用于TCHAR
缓冲区,例如:
title
或者:
TCHAR title[256];
int title_length = 256;
GetWindowText(spotify_window_handle, title, title_length);
答案 1 :(得分:0)
这取决于您是否使用Unicode。既然你说\ uFFFD你最有可能是Unicode
WCHAR *wp;
while ((wp= wcschr(title, '\uFFFD'))!=NULL) {
*wp= L'-';
}
答案 2 :(得分:0)
假设字符串是wchar_t
:
wchar_t * p = wcschr(title, `\uFFFD`);
if (p)
*p = `\u002D`;