码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【GCC】关于 -finput-charset= 和 -fexec-charset= 选项


    目录

    • 一、-finput-charset= 选项
    • 二、-fexec-charset= 选项
    • 三、总结

    gcc 版本:4.6.3
    运行环境:Linux 3.5.0 (Ubuntu 12.04.2 LTS)
    文件二进制查看工具:WinHex
    编码在线转换:http://www.mytju.com/classcode/tools/encode_utf8.asp 🚀

    一、-finput-charset= 选项

    当点击保存的时候,中文在内存中的保存形式同英文一样都需要对其进行编码,常见的编码方式有 GB2312、GBK、Big5、UTF-8 等,保存的时候编辑器一般有默认的中文编码方式,当用另外一个软件打开的时候需要指定好中文对应的编码方式,不然就会出现乱码的情况,比如,Visual Studio 2019 敲的中文注释,在 Visual Studio Code 打开就会出现乱码。

    有些软件在保存的时候是支持选用编码格式的,比如 Windows 自带的文本编辑器。文件 —> 另存为 ——> 此时就出现了编码的选项。

    在这里插入图片描述

    当我们用 vim 编辑器点击保存的时候使用时,默认使用的是 UTF-8 。

    查看文件编码格式:
    进入 vim 编辑器 ——> 输入 :set fileencoding ,回车

    测试代码:

    /* 1.c */
    #include 
    
    int main(int argc, const char *argv[])
    {
    	printf("你好\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通过 WinHex 查看源代码的二进制形式,可以发现与 UTF-8 编码相同。

    在这里插入图片描述

    查看 GCC 官方文档,关于 -finput-charset= 的作用:应该用什么格式解读输入文件,如果没有指定则默认为UTF-8。

    在这里插入图片描述

    所以存在这么一种情况,当 vim 以 UTF-8 编码保存,然后在编译的时候加入 -finput-charset=GBK,则 GCC 会将 UTF-8 编码值当成 GBK 来看待,然后将 GBK 编码值转换成 UTF-8 (可执行代码的编码格式,可通过 -fexec-charset= 选项指定)。

    通过上面的测试代码做一个举例,编译:gcc -finput-charset=GBK -E 1.c -o 1.s

    在这里插入图片描述
    1.s 文件如上所示,方框中的数据转换过程如下:

    1. “你好” 的 UTF-8 编码的八进制为:\344\275\240 (你)\345\245\275 (好),十六进制依次为0xE4、0xBD、0xA0、0xE5、0xA5、0xBD。

    2. GBK 编码为 2 个字节,将 UTF-8 当成 GBK 看待,所以依次为 0xE4BD、0xA0E5、0xA5BD。

    3. GBK 编码值 0xE4BD 的字符为 “浣”,这个字符所对应的 UTF-8 编码值为 0xE6B5A3(\346\265\243),这就是转换完成的结果,其余字符依次按这样的方式转换。

    二、-fexec-charset= 选项

    -fexec-charset=GBK:设置编译出的可执行程序中的字符是 GBK 编码。

    在这里插入图片描述
    转换过程同上述的一致,只是上面需要完成 GBK 转换为 UTF-8,这里由于选项 -fexec-charset= 的作用,将 GBK 转换为 GBK,所以保持不变。

    三、总结

    GCC 编译的时候,首先需要指定源代码的解读方式(默认为 UTF-8 ),然后根据编译成可执行文件的编码方式(默认为 UTF-8 ),将输入的源代码的编码值转换为可执行文件所指定编码方式的编码值。

    🔍 如理解有误,望不吝指正。

    参考:
    [1]: 在Vim中查看文件编码和文件编码转换 🚀
    [2]: vim中查看和修改文件编码格式 🚀
    [3]: 嵌入式Linux_Framebuffer_04点阵显示汉字的方法 🚀

  • 相关阅读:
    浏览器发送请求的方法
    【Linux篇】第八篇——进程地址空间
    什么是轻量应用服务器?腾讯云轻量服务器可以干什么?
    VIAVI唯亚威FFL-050/-100 可视故障定位仪
    Kafka
    Win10怎样取消自动固定到快速访问?
    【Leetcode】 17. 电话号码的字母组合
    【空间&单细胞组学】第1期:单细胞结合空间转录组研究PDAC肿瘤微环境
    【视觉SLAM入门】7.2. 从卡尔曼滤波到扩展卡尔曼滤波,引入、代码、原理、实战,C++实现以及全部源码
    机器视觉软件破解的背后是道高一尺,魔高一丈
  • 原文地址:https://blog.csdn.net/weixin_42258222/article/details/127772668
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号