C++替换不符合Unicode/UTF-8规范的显示为�的字符 背景 因项目需要,本人遇到一个问题:将一串十六进制的UTF-8编码转换为文字,其中存在不符合Unicode/UTF-8规范的字符,程序运行后会显示
C++替换不符合Unicode/UTF-8规范的显示为�的字符
背景
因项目需要,本人遇到一个问题:将一串十六进制的UTF-8编码转换为文字,其中存在不符合Unicode/UTF-8规范的字符,程序运行后会显示为�,因此需要去除不符合规范的字符。
举例
输入一串十六进制:
"\xe8\xaf\x95xed\xef\xef\xe8\xaf\x95"
指定UTF-8解码,得到结果:
"试���试"
期望的结果是移除不合法字符:
"试试"
代码
#include <stdio.h>
#include <iconv.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <errno.h>
char *remove_invalid_utf8(char *utf8, size_t len) {
size_t inbytes_len = len;
char *inbuf = utf8;
size_t outbytes_len = len;
char *result = calloc(outbytes_len + 1, sizeof(char));
char *outbuf = result;
iconv_t cd = iconv_open("UTF-8//IGNORE", "UTF-8");
if(cd == (iconv_t)-1) {
perror("iconv_open");
}
if(iconv(cd, &inbuf, &inbytes_len, &outbuf, &outbytes_len)) {
perror("iconv");
}
iconv_close(cd);
return result;
}
int main() {
char *utf8 = "some invalid\xFE\xFE\xFF\xFF stuff";
char *converted = remove_invalid_utf8(utf8, strlen(utf8));
printf("converted: %s to %s\n", utf8, converted);
free(converted);
return 0;
}
分析
核心:
调用<iconv.h>库,使用"//IGNORE"(第16行,"UTF-8//IGNORE")
iconv介绍
iconv函数将一个代码集中的字符串行转换另一个代码集中的相应字符串行。(即字符编码转换) 链接
Python中的类似语法
xxx.decode("UTF-8",errors='ignore')
参考资料
[1] How to replace/ignore invalid Unicode/UTF8 characters � from C stdio.h getline()?