smile unicode 的utf8编码是F0 9F 98 8A(十六进制表示)。
c代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char * argv[]) {
char * smile = "?";
printf("%s\n", smile);
printf("len:%ld\n", strlen(smile));
for (int i=0; i<strlen(smile); i++) {
printf("%X\t",smile[i]);
}
puts("");
return EXIT_SUCCESS;
}
输出结果:
?
len:4
FFFFFFF0 FFFFFF9F FFFFFF98 FFFFFF8A
问题:
为啥高位都是F呢?打印char应该用%hhX,用%X隐含类型提升,补了高位的1。
每个字节都只用了最后两位,一个字节就能装下,为什么要分到四个字节呢?0xF0 就是一个字节--八位。
mysql的utf8只有三字节,『?』需要四个,如果不用utf8mb4就会丢失标签显示乱码。那么这个长度检查是在哪个环节处理的呢?一定要检查每个字符的合法性吗?直接存码流行吗?
因为smile[i]被自动提升为int型了。因为你的那些字节最高位都是1。所以提升时补1,打印的高位都是F。用%02X就可以了。