/** * 将缓冲区中的字符串转换为指定的编码. * @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; }
/** * 创建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; }
/** * 创建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; }
/** * 将缓冲区中的数据转换为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++; } }