c 语言是如何给汉字编码的?

51 天前
 rookiemaster

如下程序:

#include <stdio.h>
int main()
{
    char s[7] = "七 123";
    int i;
    for (i = 0; i < 7; i++)
    {
        printf("%d,", s[i]);
    }
}

打印出来的结果是:-28,-72,-125,49,50,51,0,
前面的-28,-72,-125 正是七的 utf8 编码
要是我想打印出七的 gbk 编码应该怎么办?

1820 次点击
所在节点    C
12 条回复
bczhc
51 天前
c 语言没有严格规定的字符编码,一般跟系统设定有关。如果只能在程序中获取到 utf-8 ,那就得用 utf8-gbk 转换库
nullyouraise
51 天前
取决于你这个文件的编码
rekulas
51 天前
用 iconv 转 或者手写转换
rookiemaster
51 天前
@nullyouraise 谢谢,正解
PTLin
51 天前
Noicdi
51 天前
取决于你在编译时的源文件是通过什么字符编码保存的
BD8NCF
51 天前
你的代码文件使用 GBK 就可以得到了。
现在大部分的 IDE 都使用 utf8
另外,如果你对编码有兴趣,应该习惯看十六进制才行。
printf("0x%02X,", s[i]);
shawndev
51 天前
了解 icu, iconv, chardet 对你的问题很有帮助。
jim9606
51 天前
C/C++本身没有定义要用那种字符编码,取决于编译器的处理方式和运行平台。
如果你的源码文件带 UTF-8 BOM ,当前版本的 MSVC 和 GCC 都会将编译器字面量作为 UTF-8 字符串处理。
MSVC/GCC 都有选项强制指定编译编码和运行编码。
转编码的话虽然标准库有 codecvt 库,但应该没啥人用,都用 WideCharToMultiByte/iconv/ICU 。
dianso
51 天前
用百分比编码比较好
wjx0912
50 天前
字符集和编码的区别,这个搞清楚就行
CLMan
50 天前
美国是现代计算机的发源地,当时的先驱们只考虑了英文字符,也即是 ASCII 。C 语言诞生的时候,还处于计算机的早期发展阶段(大陆同期还在文革),因此当时只考虑到 ASCII ( char 类型的概念及相关标准库)。

后来,C 语言流传到各个国家,对汉字等非英文字符的支持,都是非官方标准,需要修改编译器和标准库实现。主要考虑两点:

- 字符常量的编码,字符串常量被编码为字节存储在库或者可执行文件里面
- printf 等涉及编码的标准库函数

再后来,C 标准更新,以增加对非英文字符的支持,比如:

- C99 支持使用转义字符形式的 Unicode 标识符
- C11 在语言上支持 u,U,u8 前缀表示的 UTF16,UTF32,UTF8 字符串,在标准库 uchar.h 里提供了 Unicode 支持
- C23 支持使用 u8 前缀表示的 UTF-8 单字节字符

------

字符集和字符编码应当是 CS 专业的基础知识(计算机科学概论),ASCII,ISO-8859,GB2312,GBK,Unicode(包括 UCS-2,UCS-4),UTF-8&UTF-16&UTF-32(以及 LE,BE,BOM)是计算机发展史在字符上的一个切面,可以参考阮一峰的博文: https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024844

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX