![]() |
1
13
在我进一步说之前,我要提到的是,你所做的不是C/C++兼容的。这个 specification 在2.2中说明哪些字符集在源代码中有效。里面没什么,所有的字符都是ASCII码。所以…下面的所有内容都是关于一个特定的实现(事实上,VC2008是在一台美国本地机器上实现的)。
首先,你有4个字符
从源字符串到控制台上的显示,所有这些都起到了作用:
现在。。。 1和2相当容易。看起来编译器会猜测源文件的格式,并将其解码为其内部表示形式。它在当前代码页中生成字符串文本对应的数据块,不管源代码是什么。我在这方面找不到明确的细节/控制。
3更容易。除控制代码外,
4由控制
5是一个有趣的。我用CP1252(西欧版,Windows版)敲了敲脑袋,想知道为什么我不能让_)正常出现。结果是,我的系统字体没有该字符的字形,并且有用地使用了我的标准代码页的字形(大写theta,如果我不调用setconsoleoutputcp,我也会得到同样的字形)。为了解决这个问题,我必须将控制台上使用的字体改为Lucida控制台(真正的字体)。 我学到了一些有趣的东西:
所以…这对你意味着什么?以下是一些建议:
顺便说一句,如果你得到的是“___”,而不是你粘贴的内容,那么看起来你的4个字节被解释为 CP850 . |
![]() |
2
5
试试这个:
|
![]() |
3
2
我试过这个代码:
调试器显示,wss、s和p与输出文件一样,都具有预期值(即“___”)。然而,控制台上出现的是¨。 因此,问题是在VisualStudio控制台中,而不是C++。使用Bahbar出色的答案,我补充道:
作为第一行,然后控制台输出按它应该的方式出现。 |
![]() |
4
2
因为我被要求去做,我会做一些巫术。其他答案来自2009年,但这篇文章仍然是我在2018年搜索到的。今天的情况完全不同。而且,即使是在2009年,接受的答案也是不完整的。 源字符集每一个编译器(包括微软公司的Visual Studio 2008和以后,GCC,CLAN和ICC)都会读取从BOM开始的UTF-8源文件,而没有问题,CLAN将不读取任何东西,而UTF-8,所以带有BOM的UTF-8是C和C++源文件的最低公分母。 语言标准没有说明编译器需要支持的源代码字符集。一些真实的源文件甚至保存在与ASCII不兼容的字符集中。微软Visual C++在2008支持具有字节顺序标记的UTF-8源文件,以及UTF-16的两种形式。如果没有字节顺序标记,则假定该文件是在当前的8位代码页中编码的,该页始终是ASCII的超集。 执行字符集
2012年,编译器添加了
当前版本的C++标准称编译器必须同时具有执行字符集,它决定字符常量的数值。
对于语言律师来说,在这些标准中很少需要对这些代码进行编码,而VisualC和C++则试图打破它们。它必须包含大约100个不能有负值的字符,以及数字的编码
VisualC和C++违反语言标准的方式是通过
UTF-8字符串文本这个问题提出的第三个问题是如何让编译器在内存中将字符串文本编码为utf-8。自从C++ 11以来,你就能够写出这样的东西:
不管源字符集是UTF-8、UTF-16、Latin-1、CP1252,甚至是IBM EBCDIC 1047(这是一个愚蠢的理论示例,但为了向后兼容,还是IBM的z系列主机编译器上的默认值),这都会将字符串编码为以空结尾的UTF-8字节表示形式。也就是说,它相当于用
如果在中键入字符太不方便,或者要区分表面上相同的字符(如空格和不间断空格)或预组合和组合字符,则还具有通用字符转义:
无论源字符集如何,也不管是否将文本重新存储为utf-8、utf-16或ucs-4,都可以使用这些字符集。它们最初是在C99中添加的,但Microsoft在Visual Studio 2015中支持它们。在Visual C或C++ 2008中,还有另一种方法:八进制和十六进制转义代码。您将在该版本的编译器中使用以下代码对UTF-8文本进行编码:
|
![]() |
5
1
使用
用户:
|
![]() |
6
0
VisualStudio不支持C++的UTF 8,但部分支持C:
|
![]() |
7
0
确保你不会忘记 将控制台的字体改为lucida consolas 正如Bahbar所提到的:在我的案例中,这是至关重要的(法国队凭借VC 2012赢得了7 64位)。 然后,其他人提到C++使用SETCONSOLUTPUPDCP(1252),但是它可能依赖于可用的页面失败,因此您可能希望使用GETCONSOLUTPUT()来检查它是否工作,或者至少检查SETCONSOLUETCPTCP(1252)是否返回零。更改全局区域设置也有效(出于某种原因,不需要执行cout.imbue(locale());但它可能会破坏一些库! 在C中 ,setconsoleoutputcp(65001);或者基于区域设置的方法对我有效。 有一次我把源代码保存为没有签名的utf8 (向下滚动,sans签名选项在页面列表的下方)。 输入 使用setconsolecp(65001);显然由于在Windows中执行了错误的page 65001而失败。区域方法在C和C++中都失败了。一个更复杂的解决方案,不是依赖本地字符,而是依赖wchar_t,这似乎是必需的。 |
![]() |
Bard.Mus · 迁移后的数据库字符集环境 6 月前 |
![]() |
David · 何时实际应用字符编码? 7 月前 |
![]() |
Karlomanio · 区分两个西里尔字母字符串 1 年前 |
![]() |
Gabriel Lucizano · 为什么我无法访问C中的文件 1 年前 |
![]() |
Mira Kumar · 在网页上显示特殊字符 1 年前 |
![]() |
jay.sf · 如何在pdf中使用UTF-8编码的字符矢量? 1 年前 |
![]() |
Kevin Patel · UTF-8内容在Java中是否可能格式错误 1 年前 |