示例#1
0
/**
 * 将缓冲区中的字符串转换为指定的编码.
 * @param encode 字符集编码
 */
void Command::ConvertEncode(const char *encode)
{
        char *ptr;

        if (encode && strcasecmp(encode, "utf-8") != 0
                 && (ptr = convert_encode(buf, encode, "utf-8"))) {
                size = strlen(ptr) + 1;
                memcpy(buf, ptr, size);
                //g_free(ptr);
		//ptr = NULL;
        }
	g_free(ptr);
	ptr = NULL;
}
示例#2
0
/**
 * 创建ipmsg的扩展数据(即文件信息).
 * @param extra 扩展数据
 * @param encode 字符集编码
 */
void Command::CreateIpmsgExtra(const char *extra, const char *encode)
{
        char *pptr, *ptr;

        pptr = buf + size;
        if (encode && strcasecmp(encode, "utf-8") != 0
                 && (ptr = convert_encode(extra, encode, "utf-8"))) {
                snprintf(pptr, MAX_UDPLEN - size, "%s", ptr);
                g_free(ptr);
        } else
                snprintf(pptr, MAX_UDPLEN - size, "%s", extra);
        if ( (ptr = strrchr(pptr, '\a')))
                *(ptr + 1) = '\0';
        size += strlen(pptr) + 1;
}
示例#3
0
/**
 * 创建iptux程序独有的扩展数据.
 * @param encode 字符集编码
 */
void Command::CreateIptuxExtra(const char *encode)
{
        char *pptr, *ptr;

        pptr = buf + size;
        if (encode && strcasecmp(encode, "utf-8") != 0
                 && (ptr = convert_encode(progdt.mygroup, encode, "utf-8"))) {
                snprintf(pptr, MAX_UDPLEN - size, "%s", ptr);
                g_free(ptr);
        } else
                snprintf(pptr, MAX_UDPLEN - size, "%s", progdt.mygroup);
        size += strlen(pptr) + 1;

        pptr = buf + size;
        snprintf(pptr, MAX_UDPLEN - size, "%s", progdt.myicon);
        size += strlen(pptr) + 1;

        pptr = buf + size;
        snprintf(pptr, MAX_UDPLEN - size, "utf-8");
        size += strlen(pptr) + 1;
}
示例#4
0
/**
 * 将缓冲区中的数据转换为utf8编码.
 * @param enc 原数据首选编码
 */
void UdpData::ConvertEncode(const char *enc)
{
        char *ptr;
        size_t len;

        /* 将缓冲区内有效的'\0'字符转换为ASCII字符 */
        ptr = buf + strlen(buf) + 1;
        while ((size_t)(ptr - buf) <= size) {
                *(ptr - 1) = NULL_OBJECT;
                ptr += strlen(ptr) + 1;
        }

        /* 转换字符集编码 */
        /**
         * @note 请不要采用以下做法,它在某些环境下将导致致命错误: \n
         * if (g_utf8_validate(buf, -1, NULL)) {encode = g_strdup("utf-8")} \n
         * e.g. 系统编码为GB18030的xx发送来纯ASCII字符串 \n
         */
        if (enc && strcasecmp(enc, "utf-8") != 0
                 && (ptr = convert_encode(buf, "utf-8", enc)))
                encode = g_strdup(enc);
        else
                ptr = iptux_string_validate(buf, progdt.codeset, &encode);
        if (ptr) {
                len = strlen(ptr);
                size = len < MAX_UDPLEN ? len : MAX_UDPLEN;
                memcpy(buf, ptr, size);
                if (size < MAX_UDPLEN)
                        buf[size] = '\0';
                g_free(ptr);
        }

        /* 将缓冲区内的ASCII字符还原为'\0'字符 */
        ptr = buf;
        while ( (ptr = (char *)memchr(ptr, NULL_OBJECT, buf + size - ptr))) {
                *ptr = '\0';
                ptr++;
        }
}