如何让Tcl_WriteChars支持Unicode?

时间:2017-10-22 12:09:37

标签: unicode utf-8 tcl

是否需要进行初始设置才能使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
??
你好

1 个答案:

答案 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 ++中)所以我希望它没问题。