是否有接受Unicode的C/C++ system()函数?

4

问题:在C/C++中,是否有任何接受Unicode的系统函数? 请参见以下原因:

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[])
{
    // https://dev59.com/KE_Sa4cB1Zd3GeqP-0Sx
    system("osascript -e \"tell application \\\"Address Book\\\" to activate\"");
    return EXIT_SUCCESS;
}

我不理解原因。你能解释一下吗? - Björn Pollex
3
为什么在明显需要运行OS X的代码中使用“linux”标签? - Konrad Rudolph
1
提供的示例与Unicode有什么关系? - Nicholas Knight
顺便提一下:您可能想检查 system() 的返回值是否为 0,或者从您的主函数中 return EXIT_FAILURE。只有这样,生成的可执行文件才能(显然)成功完成。您可能永远不需要该返回值,但这是一个好的编程风格。 - Christian.K
1
@Nicholas Knight:简单来说,如果应用程序标题是“Адресная книга”或“通訊錄”(俄语/中文的“Address book”),而系统函数只接受ASCII编码,会发生什么情况? - Stefan Steiger
3个回答

9

8

据我所知,system() 不关心编码格式,它只是简单地传输字符串。

也许你的问题是“如何在C中键入UTF-8字符串文字”或“osascript期望使用什么编码格式”?

C语言中进行UTF-8编码的便携式方法是使用 \x 转义序列,但如果您愿意依赖于C99或特定的编译器,通常可以直接键入UTF-8。

我猜测osascript期望使用UTF-8编码,尽管我不确定。


我也不是,我只是在为一个在mono-Linux应用程序中修复OS X问题而苦苦挣扎。 - Stefan Steiger
如果您的实际代码就像示例中显示的那样只是ASCII码,那么就没有问题 - 我假设实际代码不是ASCII码。 - Havoc P
实际的代码将是C#。我只是在想,如果一个应用程序没有像“Address Book”这样的标题,而是像“Адресная книга”或“通讯录”这样的标题,会发生什么。 - Stefan Steiger
啊,好的。C#字符串被定义为Unicode格式,对吧?所以唯一的问题是当你使用system()函数时,C#会传递什么编码给shell。你可以尝试使用类似于system("echo Адресная книга > somefile.txt")的命令,然后查看文件中得到的内容。 - Havoc P
嗯,仔细想想,我可以使用Process.Start("osascript")并将参数作为startupinfo传递,让C#即mono团队来处理其余部分。 - Stefan Steiger

2

标准的C和C++根本不理解Unicode:没有一个标准API定义为接受或返回Unicode字符串。与Java不同,无论是宽字符串还是多字节字符串实际上都是系统相关的Unicode编码字符串。因此,简单的答案是不支持


1
在这种情况下,如果system()(或shell)在将其传递给osascript之前以某种方式干扰编码,那么这将是令人惊讶的。因此问题在于osascript需要什么。如果osascript需要UTF-8,这似乎很可能,您只需确保C字符串为UTF-8,这可以通过\x转义序列完成。编译器不会干扰您指定的字节。的确,system()未定义要采用任何特定的编码(它甚至为什么需要?),但这在这里并不重要。 - Havoc P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接