示例#1
0
文件: wchar.c 项目: giuse88/nucleo
// nota bene, fa utilizzo di primitive sistema, non è portabile
void print_w (const wchar * name) {
 
  dword size=wcslen(name); 
  
  char *buf= (char *)mem_alloc(size+1, 1); 
  
  memset(buf,0,size+1); 
  uni2char(name, buf, size); 
  
  flog(LOG_WARN, "%d %s ", size, buf); 
  
  mem_free(buf); 
  
}
示例#2
0
EXP_OPTION void unicode2ascii(const char* uni, char* dest)
{
    int len, i, j, k;
    long c;

    RETURN_VOID_IF_NULL(uni);
    RETURN_VOID_IF_NULL(dest);

    len = strlen(uni);
    memset(dest, 0, len+1);
    for(i = j = 0; i < len; i++) {
        if(uni[i] == '\\' && uni[i+1] == 'x') {
            if(uni[i+2] == '0' && uni[i+3] == '0') {
                if(uni[i+4] >= 'A' && uni[i+4] <= 'Z') { // simple char in form \x00A
                    dest[j] = (unsigned char)uni[i+4];
                    i += 4;
                    j++;
                    continue;
                } else {
                    i += 3;
                    continue;
                }
            }
            if(uni[i+2] == '0' && uni[i+3] != '0') { // more complex char like \x0}1
                c = 0;
                // first pos
                k = uni[i+2];
                k = (((k >= '0') && (k <= '9')) ? k - '0' : k);
                k *= 4096;
                c += k;
                // second pos
                k = uni[i+3];
                k = (((k >= '0') && (k <= '9')) ? k - '0' : k);
                k *= 256;
                c += k;
                // third pos
                k = uni[i+4];
                k = (((k >= '0') && (k <= '9')) ? k - '0' : k);
                c += k;
                if(c >= 0 && c <= 9) c+= '0';
                // get corresponding cp1252 char
                if(c > 256) {
#ifdef WIN32
                    dest[j] = (unsigned char)uni2char(c);
                    j++;
#else
                    dest[j] = uni2utf8(c, 0);
                    j++;
                    dest[j] = uni2utf8(c, 1);
                    j++;
#endif
                } else {
                    dest[j] = (unsigned char)c;
                    j++;
                }
                i += 4;
                continue;
            }
            if(uni[i+2] != '0' && uni[i+3] != '0') { // hex char code like \xC4
                c = hex2char(uni[i+2]) * 16 + hex2char(uni[i+3]);
                if(c > 256) {
#ifdef WIN32
                    dest[j] = (unsigned char)uni2char(c);
                    j++;
#else
                    dest[j] = uni2utf8(c, 0);
                    j++;
                    dest[j] = uni2utf8(c, 1);
                    j++;
#endif
                } else {
                    dest[j] = (unsigned char)c;
                    j++;
                }
                i += 3;
                continue;
            }
        } else {
            dest[j] = uni[i];
            j++;
        }
    }
}