V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rookiemaster
V2EX  ›  C

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

  •  
  •   rookiemaster · 39 天前 · 1774 次点击
    这是一个创建于 39 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下程序:

    #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 编码应该怎么办?

    12 条回复    2024-03-19 16:01:11 +08:00
    bczhc
        1
    bczhc  
       39 天前
    c 语言没有严格规定的字符编码,一般跟系统设定有关。如果只能在程序中获取到 utf-8 ,那就得用 utf8-gbk 转换库
    nullyouraise
        2
    nullyouraise  
       39 天前
    取决于你这个文件的编码
    rekulas
        3
    rekulas  
       39 天前
    用 iconv 转 或者手写转换
    rookiemaster
        4
    rookiemaster  
    OP
       39 天前
    @nullyouraise 谢谢,正解
    Noicdi
        6
    Noicdi  
       39 天前 via iPhone   ❤️ 1
    取决于你在编译时的源文件是通过什么字符编码保存的
    BD8NCF
        7
    BD8NCF  
       39 天前   ❤️ 1
    你的代码文件使用 GBK 就可以得到了。
    现在大部分的 IDE 都使用 utf8
    另外,如果你对编码有兴趣,应该习惯看十六进制才行。
    printf("0x%02X,", s[i]);
    shawndev
        8
    shawndev  
       39 天前   ❤️ 2
    了解 icu, iconv, chardet 对你的问题很有帮助。
    jim9606
        9
    jim9606  
       39 天前
    C/C++本身没有定义要用那种字符编码,取决于编译器的处理方式和运行平台。
    如果你的源码文件带 UTF-8 BOM ,当前版本的 MSVC 和 GCC 都会将编译器字面量作为 UTF-8 字符串处理。
    MSVC/GCC 都有选项强制指定编译编码和运行编码。
    转编码的话虽然标准库有 codecvt 库,但应该没啥人用,都用 WideCharToMultiByte/iconv/ICU 。
    dianso
        10
    dianso  
       39 天前
    用百分比编码比较好
    wjx0912
        11
    wjx0912  
       39 天前
    字符集和编码的区别,这个搞清楚就行
    CLMan
        12
    CLMan  
       38 天前
    美国是现代计算机的发源地,当时的先驱们只考虑了英文字符,也即是 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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2858 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:59 · PVG 14:59 · LAX 23:59 · JFK 02:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.