内部 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++ 中的字符编码?的主要内容,如果未能解决你的问题,请参考以下文章