Hello.

I have the same problem here in Poland. I wrote a quickhack that does
the trick in C.

It creates "ns_utf8" Tcl command which I use to convert from external to
utf and back. I use this way:
Instead of
   set text [ns_queryget text]
I use
   set text [ns_utf8 eu [ns_queryget text]]

Now it is utf-8 encoded (not with the proper encoding though - I should
use iso8859-2 :), so Tcl can safely operate on these strings.

For example
   set subtext [string range $text 1 end]

Then, when I want to return it to the browser:
<%=[ns_utf8 ue $subtext]%>

Note that you'd not be able to do this properly for non-latin text
without ns_utf8...

Also, when AOLserver will finally handle utf-8 correctly, you can just
write a dummy
   proc ns_utf8 {mode text} {return $text}

It's a quickhack, but works well.

--
WK

"Data typing is an illusion. Everything is a sequence of bytes."
                                                              -Todd Coram

#ifndef USE_TCL8X
#define USE_TCL8X
#endif

#include "ns.h"
#include <tcl.h>

int Ns_ModuleVersion = 1;

static int main_tcl_command (ClientData dummy, Tcl_Interp *interp,int objc, Tcl_Obj 
*CONST objv[]) {
    char *cmd;
    char *v;
    int l;
    Tcl_DString ds;
    Tcl_Obj *rc;
    Tcl_Encoding te;

    if (objc!=3) {
        return TCL_ERROR;
    }
    if ((te=Tcl_GetEncoding(interp,NULL))==NULL) {
        return TCL_ERROR;
    }

    Tcl_DStringInit(&ds);
    cmd=Tcl_GetString(objv[1]);
    v=Tcl_GetStringFromObj(objv[2],&l);
    if (!strcmp(cmd,"eu")) {
        Tcl_ExternalToUtfDString(te,v,l,&ds);
    }  else  {
        Tcl_UtfToExternalDString(te,v,l,&ds);
    }

    Tcl_FreeEncoding(te);

    if ((rc=Tcl_NewStringObj(Tcl_DStringValue(&ds),Tcl_DStringLength(&ds)))!=NULL) {
        Tcl_SetObjResult(interp, rc);
        Tcl_DStringFree(&ds);
        return TCL_OK;
    }  else  {
        Tcl_DStringFree(&ds);
        return TCL_ERROR;
    }
}

int ns_utf8_tcl(Tcl_Interp *i, void *c) {
    Tcl_CreateObjCommand(i, "ns_utf8", main_tcl_command, NULL, NULL);
    return TCL_OK;
}

Ns_ModuleInit(char *hServer, char *hModule) {
    Ns_TclInitInterps(hServer,ns_utf8_tcl,NULL);
    return NS_OK;
}

Reply via email to