是否需要进行初始设置才能使Tcl_WriteChars
正确输出UTF-8字符? e.g。
#include <tcl.h>
int main()
{
Tcl_Interp *tcl = Tcl_CreateInterp();
Tcl_Channel channel = Tcl_GetStdChannel(TCL_STDOUT);
Tcl_WriteChars(channel, "hello\n", -1);
Tcl_WriteChars(channel, "你好\n", -1);
Tcl_WriteRaw(channel, "你好\n", -1);
Tcl_Close(tcl, channel);
Tcl_DeleteInterp(tcl);
return 0;
}
源代码以UTF-8编码保存,以下输出来自UTF-8语言环境Linux:
hello
??
你好
答案 0 :(得分:3)
您需要将编码配置为UTF-8(并且您运行的主机似乎使用其他内容作为默认值)。在写入频道之前执行此操作。
Tcl_SetChannelOption(interp, channel, "-encoding", "utf-8");
正确地说,你应该检查它的返回码(如下所示),但是所有通道都有该选项,utf-8
编码直接写入Tcl,所以它不会失败。
if (Tcl_SetChannelOption(interp, channel, "-encoding", "utf-8") != TCL_OK) {
return TCL_ERROR;
}
[编辑]:重新仔细阅读代码(并发现系统的默认编码首先是UTF-8),实际的问题就是你'没有打电话给Tcl_FindExecutable()
。该例程有点错误命名,因为它实际上做了什么(除了在脚本中使info nameofexecutable
工作)是让Tcl初始化其内部库。特别是,它初始化了编码管理子系统,这就是它确定系统编码实际是什么的点(否则它会回落到iso8859-1
,这是从中恢复的问题最少的普通编码)。 p>
您的代码应为:
#include <tcl.h>
int main(int argc, char *argv[]) /// <<<< CHANGED HERE
{
Tcl_FindExecutable(argv[0]); /// <<<< CHANGED HERE
Tcl_Interp *tcl = Tcl_CreateInterp();
Tcl_Channel channel = Tcl_GetStdChannel(TCL_STDOUT);
Tcl_WriteChars(channel, "hello\n", -1);
Tcl_WriteChars(channel, "你好\n", -1);
Tcl_WriteRaw(channel, "你好\n", -1);
Tcl_Close(tcl, channel);
Tcl_DeleteInterp(tcl);
return 0;
}
我假设您使用的编译器非常乐意在声明后添加声明。这是一个广泛实现的C99功能(也是在C ++中)所以我希望它没问题。