二进制文件有编码吗?困惑

问题描述 投票:0回答:2

假设我编写以下 C 程序并将其保存在名为 Hello.c 的文本文件中

#include<stdio.h>
int main()
 {
     printf("Hello there");
     return 0;
 }

Hello.c
文件可能会以 UTF8 编码格式保存。

现在,我编译此文件以创建一个名为

Hello

的二进制文件

现在,这个二进制文件应该以某种方式存储文本“

Hello there
”。问题是使用什么编码来存储此文本?

c encoding binaryfiles
2个回答
0
投票

据我所知,vanilla C 没有任何编码的概念,尽管如果你正确地跟踪多字节字符,你可能可以使用编码。默认情况下,ASCII 用于将字符映射到单字节字符。

关于字符串“Hello There”存储在可执行文件本身中,您是正确的。字符串文字被放入全局内存中,并在调用 printf 时替换为指针,因此您可以在二进制文件的数据段中看到字符串文字。

如果您可以使用十六进制编辑器,请尝试编译程序并在编辑器中打开二进制文件。 Here是我执行此操作时的屏幕截图。您可以看到字符串文字的每个字符都由一个字节表示,后跟 0 (NULL)。这是 ASCII。


0
投票

源代码中的字符和结果程序中的字符之间的转换是实现定义的。 gcc 提供了命令行选项来控制此行为。其他编译器可能有类似的选项。

来自 https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

-fexec-charset=字符集

设置执行字符集,用于字符串和字符常量。默认为 UTF-8。字符集可以是系统 iconv 库例程支持的任何编码。

-fwide-exec-charset=字符集

设置宽执行字符集,用于宽字符串和字符常量。默认值是 UTF-32BE、UTF-32LE、UTF-16BE 或 UTF-16LE 之一,以对应于 wchar_t 的宽度以及用于代码生成的大端或小端字节顺序。与 -fexec-charset 一样,字符集可以是系统 iconv 库例程支持的任何编码;但是,您可能会遇到与 wchar_t 不完全匹配的编码问题。

-finput-charset=字符集

设置输入字符集,用于从输入文件的字符集转换为GCC使用的源字符集。如果语言环境未指定,或者 GCC 无法从语言环境获取此信息,则默认为 UTF-8。这可以被区域设置或此命令行选项覆盖。目前,如果存在冲突,则命令行选项优先。字符集可以是系统 iconv 库例程支持的任何编码。

您可能还想阅读https://gcc.gnu.org/onlinedocs/cpp/Character-sets.html

一般来说,如果源字符集与编写的源代码不匹配,或者编译器假定的执行字符集与您传递字符串的 API 所期望的字符集不匹配,那么您可能会收到错误或莫吉贝克。

大多数情况下,当您想要/需要使用超出 ASCII 范围的字符时,您必须开始担心这一点。

© www.soinside.com 2019 - 2024. All rights reserved.