tcl / tk中的国际字符无法处理

时间:2016-04-12 19:01:40

标签: encoding tcl

我使用tcl shellicon命令提取图标,正如它在下面的wiki页面上提到的,其中有一些国际字符问题,然后我写了一些代码进行测试但它不起作用,任何人都可以帮我纠正它

/*
 * testdll.c
 * gcc compile: gcc testdll.c -ltclstub86 -ltkstub86 -IC:\Users\L\tcc\include -IC:\Users\L\tcl\include -LC:\Users\L\tcl\lib -LC:\Users\L\tcc\lib -DUSE_TCL_STUBS -DUSE_TK_STUBS -shared -o testdll.dll
 */
#include <windows.h>
#include <tcl.h>
#include <stdlib.h>

int TestdllCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) {
    char * path;
    Tcl_DString ds;

    if (objc > 2) {
        Tcl_SetResult(interp, "Usage: testdll ?path?",NULL);
        return TCL_ERROR;
    }
    if (objc == 2) {
        path = Tcl_GetString(objv[objc-1]);
        path = Tcl_TranslateFileName(interp, path, &ds);
        if (path != TCL_OK) {
            return TCL_ERROR;
        }
    }
    Tcl_AppendResult(interp, ds, NULL);
    return TCL_OK;
}

int DLLEXPORT Testdll_Init(Tcl_Interp *interp) {
    if (Tcl_InitStubs(interp, "8.5", 0) == NULL) {
        return TCL_ERROR;
    }
    Tcl_CreateObjCommand(interp, "testdll", TestdllCmd, NULL, NULL);
    Tcl_PkgProvide(interp, "testdll", "1.0");
    return TCL_OK;
}

我用以下代码编译它:

gcc compile: gcc testdll.c -ltclstub86 -ltkstub86 -IC:\Users\USERNAME\tcc\include -IC:\Users\USERNAME\tcl\include -LC:\Users\USERNAME\tcl\lib -LC:\Users\USERNAME\tcc\lib -DUSE_TCL_STUBS -DUSE_TK_STUBS -shared -o testdll.dll

windows cmd shell运行:tclsh testdll.tcl

load testdll
puts [testdll C:/Users/L/桌面]

输出是:

// This line isn't in the output, just to show the first line of output is a *EMPTY LINE*

    while executing
"testdll 'C:/Users/L/桌面'"
    invoked from within
"puts [testdll 'C:/Users/L/桌面']"
    (file "testdll.tcl" line 2)

事实上,我想打印一行,其内容为“C:/ Users / L /桌面”

我写这个dll来调试如何用Tcl_FSGetNormalizedPath,Tcl_FSGetNativePath替换Tcl_GetString,Tcl_TranslateFileName,我想知道它是否清楚?

谢谢!

1 个答案:

答案 0 :(得分:0)

删除它:

    if (path != TCL_OK) {
        return TCL_ERROR;
    }

您正在将char *int进行比较。

Tcl_TranslateFileName的手册页说:

However,  with  the  advent  of  the  newer Tcl_FSGetNormalizedPath 
and Tcl_FSGetNativePath, there is no longer any need to use this 
procedure.

您应该切换到更现代的API调用。