为什么电脑显示这些字符变成了长方形问号?

2026-04-12 02:261阅读0评论SEO资讯
  • 内容介绍
  • 相关推荐

本文共计429个文字,预计阅读时间需要2分钟。

为什么电脑显示这些字符变成了长方形问号?

C++在处理包含不合规Unicode/UTF-8编码的字符时,可能会遇到以下问题:将十六进制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()?

本文共计429个文字,预计阅读时间需要2分钟。

为什么电脑显示这些字符变成了长方形问号?

C++在处理包含不合规Unicode/UTF-8编码的字符时,可能会遇到以下问题:将十六进制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()?