字符*编码 如果我在VisualStudio下用C++编写下面的语句,这里会有什么编码?< /P> const char *c = "£";

字符*编码 如果我在VisualStudio下用C++编写下面的语句,这里会有什么编码?< /P> const char *c = "£";,c++,visual-c++,encoding,C++,Visual C++,Encoding,在Visual Studio项目设置下,我已将“字符集”设置为“未设置”。将字符集设置为“未设置”仅意味着预处理器宏_UNICODE和_MBCS都不会被设置。这对编译器使用的字符集没有影响 确定如何在程序中将源字节转换为字符串文字的两个设置是“源字符集”和“执行字符集”。编译器将把字符串文字从源编码转换为执行编码 源编码: 源编码是编译器用来解释源文件字节的编码。它不仅适用于字符串和字符文本,还适用于源代码中的所有其他内容,例如标识符 如果Visual Studio的编译器在源文件中检测到Uni

在Visual Studio项目设置下,我已将“字符集”设置为“未设置”。

将字符集设置为“未设置”仅意味着预处理器宏_UNICODE和_MBCS都不会被设置。这对编译器使用的字符集没有影响

确定如何在程序中将源字节转换为字符串文字的两个设置是“源字符集”和“执行字符集”。编译器将把字符串文字从源编码转换为执行编码

源编码: 源编码是编译器用来解释源文件字节的编码。它不仅适用于字符串和字符文本,还适用于源代码中的所有其他内容,例如标识符

如果Visual Studio的编译器在源文件中检测到Unicode“签名”,则它将使用相应的Unicode编码作为源编码。否则,它将使用系统的代码页编码作为源编码

执行编码: 执行编码是编译器存储字符串和字符文字的编码方式,这样,由文字创建的字符串和字符数据将使用执行编码进行编码

VisualStudio的编译器使用系统的代码页作为执行编码


当Visual Studio将字符串和字符文字数据从源编码转换为执行编码时,它将用“?”替换无法在执行编码集中表示的字符

以你为例:

const char *c = "£";
假设您的源代码是使用Microsoft的“UTF-8带签名”格式保存的,并且您的系统与西方大多数系统一样使用CP1252,则字符串文字将转换为:

0xA3 0x00
另一方面,如果执行字符集不包含“£”,例如cp1251(西里尔文,在Window的俄语语言环境中使用),则字符串文字将结束:

0x3F 0x00
如果要避免依赖于源代码编码,可以使用通用字符名(UCS):

如果要保证UTF-8表示,还需要避免对执行编码的依赖。您可以通过手动对其进行编码来实现这一点:

const char *c = "\xC2\xA3"; // UTF-8 encoding of "£"
C++11引入了UTF-8字符串文字,当编译器支持它们时,它会更好:

const char *c = u8"£";


自VS2015更新2以来,现在有了新的选项来控制这一点。以下是相关报价:


“还有一个/utf-8选项,它是设置“/源字符集:utf-8”和“/执行字符集:utf-8”的同义词。”

您是说字符本身中的字符集吗?它取决于编译器的执行字符集,还有编译器如何解释你的源代码文件。事实上,我有一个函数给出char*指针,我想把它发送给另一个接受char*的函数。我在识别编码时遇到了问题?因为我没有第二个函数是否接受UTF-8的任何信息?因此,为了测试相同的结果,我尝试直接将其命名为“英镑”?现在的问题是,如果我直接传递“£”,并且源文件是UTF-8编码的,那么我可以确定visual studio编译器是否正在以UTF-8编码的格式编写const char*缓冲区吗?此外,我想明确我的理解。任何一条建议都会非常有用。建议使用UTF-8(带BOM,这是Visual Studio的必选项)作为源代码编码。只需在任何像样的文本编辑器中打开文件,并使用BOM验证/设置编码为UTF-8。这样就不必使用通用字符名
\uxxx
。UTF-8是大多数现代编译器的默认源代码编码。RE:“对于BOM,Visual Studio必须这样做”实际上在最新版本中VS不再需要BOM来正确处理UTF-8源代码:Quick note。在
C++20
中,使用
u8
文字将生成
char8\t*
,因此请注意这一点。另一方面,我很好奇在这种情况下,设置新的Windows10(1803)选项
beta:Use unicode utf-8 for worldwide language
将起到什么作用。我认为它将代码页设置为65001;那么这是否意味着
char*
将表示UTF8编码的Unicode字符串?
const char *c = u8"£";
const char *c = u8"\u00A3"; // "£"