如何在C语言中手动将Unicode符号写入数组?为何指定代码无法打印Unicode字符А?
关于C语言中Unicode符号处理的两个问题解答
1. 如何在C语言中手动将Unicode符号写入数组?
首先得明确:Unicode是字符集,要把它存在数组里必须选择具体的编码方案(比如UTF-8、UTF-16、UTF-32),不同编码对应的字节序列完全不一样。拿你提到的字符А(Unicode码点U+0410)举例子:
- UTF-8编码:它是变长编码,U+0410对应的字节是
0xD0 0x90,数组可以这么写:char utf8_str[] = {0xD0, 0x90, '\0'}; // 加终止符方便用printf,直接用write输出的话可以不加 - UTF-16编码:分大小端格式,U+0410的UTF-16BE(大端)是
0x04 0x10,UTF-16LE(小端)是0x10 0x04,数组写法:// UTF-16BE char utf16be_str[] = {0x04, 0x10}; // UTF-16LE char utf16le_str[] = {0x10, 0x04}; - UTF-32编码:同样分大小端,U+0410的UTF-32BE是
0x00 0x00 0x04 0x10,UTF-32LE是0x10 0x04 0x00 0x00:// UTF-32BE char utf32be_str[] = {0x00, 0x00, 0x04, 0x10}; // UTF-32LE char utf32le_str[] = {0x10, 0x04, 0x00, 0x00};
注意:写入数组后要让终端正确显示,必须保证终端的编码和你使用的编码一致。比如终端是UTF-8模式,就别用UTF-16的数组,不然要么乱码要么无输出。
2. 为什么给定代码无法打印Unicode字符А?
先看你的代码:
int main() { char str[] = {0x0, 0x4, 0x1, 0x0}; write(1, str, 4); }
问题出在这几个核心点:
- 字节序列完全错误:字符
А的Unicode码点是U+0410,不管用哪种编码,你的数组{0x00, 0x04, 0x01, 0x00}都不对应它的任何有效编码。比如UTF-32LE格式的А是0x10,0x04,0x00,0x00,你写的字节顺序完全颠倒,甚至对应的码点是0x00010400(一个完全不同的字符)。 - 终端编码不匹配:大多数终端默认是UTF-8编码,就算你写对了UTF-16/32的字节,终端也识别不了这些字节序列,只会当成乱码或者直接忽略。
- write直接输出字节,无编码适配:
write是直接把字节原封不动输出到标准输出,不会做任何编码转换,所以如果字节序列和终端期望的编码不匹配,自然不会显示正确内容。
修正后的示例
如果想正确输出А,最简单的方式是用UTF-8编码(适配绝大多数终端):
#include <unistd.h> int main() { char str[] = {0xD0, 0x90}; // А的UTF-8字节序列 write(1, str, 2); return 0; }
或者用printf更直观(printf会根据系统环境的编码自动处理,一般默认UTF-8):
#include <stdio.h> int main() { printf("%c%c", 0xD0, 0x90); // 或者直接写printf("А"); return 0; }
内容的提问来源于stack exchange,提问作者zexed640
相关产品推荐
相关产品推荐

