如何处理显示为�的字符,它们不符合UnicodeUTF-8规范?
- 内容介绍
- 相关推荐
本文共计445个文字,预计阅读时间需要2分钟。
C++ 在处理不遵守 Unicode/UTF-8 规范的字符时,可能显示为特殊符号。例如,若需要将一个十六进制格式的 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()?
本文共计445个文字,预计阅读时间需要2分钟。
C++ 在处理不遵守 Unicode/UTF-8 规范的字符时,可能显示为特殊符号。例如,若需要将一个十六进制格式的 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()?

