内部 C++ 中的字符编码?

Posted

技术标签:

【中文标题】内部 C++ 中的字符编码?【英文标题】:Character Encoding in C++ internally? 【发布时间】:2021-10-09 17:09:25 【问题描述】:

如果我创建一个带有 u8 前缀的字符串文字,机器代码是否知道并说,该变量的相应值应该以 UTF-8 编码?

所以无论我在哪里运行程序,计算机每次都知道如何对其进行编码?还是机器码没有说,这样编码?

因为如果我用普通字符编码某些东西,而用 UTF-8 编码某些东西(例如使用 u8),那么如果机器代码没有说明,那么有什么区别以及计算机如何知道编码?

【问题讨论】:

不,除非您在字符串中添加选项,否则不会指定编码。通常你会得到你的源代码编辑器使用的任何编码。 耶! @HolyBackCat。对不起这个错误。我是说u8 这可能会有所帮助:***.com/a/67819605/1387438 【参考方案1】:

u8"..." 字符串始终以 UTF-8 编码,如 [lex.string]/1 中所指定。

"..." 字符串的编码取决于编译器(以及源文件编码),但配置 IDE 以将文件保存为 UTF-8 并且编译器不使用 UTF- 应该不难8 在纯字符串文字中。

在任何情况下,编码都是在编译时完全处理的。在编译后的代码中,字符串只是字节序列;在运行时没有编码之间的转换,除非你显式调用了一些函数。

【讨论】:

谢谢!所以机器码中并没有提到编码,而是变量只被赋值了一个值,对吧?当你运行这个机器代码时,计算机如何知道值“30”应该被编码为UTF-8作为例子?我希望你明白我的意思,我有点困惑。 @Avva 我不太明白,“应该编码”是什么意思?如,打印时如何解释字符串? 是的,对不起。这就是我的意思 @Avva 看来cout 不能直接打印u8 字符串。但一般来说,您只需使用合适的功能来打印它们。例如,可以为 char8_t 和其他字符类型重载此类函数,并在编译时通过重载决议选择正确的函数。 谢谢!!还有一个问题:例如,德语变音符号Ü编码在ISO-8859-1字符集中,十进制值为220。在EBCDIC字符集中,相同的值220编码大括号。那么程序如何知道如何表示正确的字符? @HolyBlackCat【参考方案2】:

如果我创建一个带有 u8 前缀的字符串文字,机器码 知道并说,该变量的相应值应该 用 UTF-8 编码?

机器代码一无所知。编译器将文字编码为 UTF-8 并生成正确的字节序列。

这样无论我在哪里运行程序,计算机都知道如何 每次都编码?还是机器码没说,编码吧 喜欢这个和这个?

然后在运行时发出字节序列,接收该序列的输出设备将正确地转换它,如果它知道怎么做的话。这意味着,例如,接受 UTF-8 编码的控制台将显示正确的字符,如果不显示垃圾。

【讨论】:

谢谢!!这就是我需要的,我真的很困惑。但是还有一件事:如果某物具有价值怎么办? 220. 在某些编码中它是不同的字符,对吗?所以有些编码有相同的值但代表不同的字符,它怎么知道正确的呢?用户想要什么? 我的意思是,例如,德语变音符号 Ü 以十进制值 220 编码在 ISO-8859-1 字符集中。在 EBCDIC 字符集中,相同的值 220 编码大括号. 输出字符的设备必须配置合适的解码算法。例如,在类 Unix 环境中,您可以使用环境变量 LANG 为任何控制台/终端设置正确的字母编码。【参考方案3】:

是的,该字符几乎肯定会以 UTF-8 编码,但请注意,标准不要求 char8_t 为 8 位,只是它需要能够存储 UTF-8 代码单元,所以有些奇怪C++ 运行时可以使用 16 位字符,每个元素仅存储 8 位。

另请注意char8_t 只能存储 ASCII 字符,所有其他字符都需要多个代码单元,因此即使它们只是单个字符也需要存储在 char8_t 字符串/数组中。

【讨论】:

u8 字符串文字始终采用 UTF-8 编码。除此之外 char8_t 主要是关于意图。喜欢ptrdiff_t等。 @AyxanHaqverdili 他们可能会存储一个 UTF-8 编码的字符串,但它们不必是 8 位的

以上是关于内部 C++ 中的字符编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的 Base64 编码字符串在 GDI+ 中创建图像?

C++ 中的凯撒密码编码:字符不会循环回“a”或“A”

[C++基础] 字符编码

c++字符编码转换

为啥java的默认编码不是utf-8 而是gbk

c++ 字符编码