Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的源字符串使用哪种编码? 当我有这样的C++代码: std::string narrow( "This is a narrow source string" ); std::string n2( "Win-1252 (that's the encoding we use for source files): ä,ö,ü,ß,€, ..." ); // What encoding should I pass to Win32's `MultiByteToWideChar` function // to convert these string to a propoer wchar_t (= UTF-16 on Windows)?_C++_Windows_Winapi_Visual C++_Character Encoding - Fatal编程技术网

我的源字符串使用哪种编码? 当我有这样的C++代码: std::string narrow( "This is a narrow source string" ); std::string n2( "Win-1252 (that's the encoding we use for source files): ä,ö,ü,ß,€, ..." ); // What encoding should I pass to Win32's `MultiByteToWideChar` function // to convert these string to a propoer wchar_t (= UTF-16 on Windows)?

我的源字符串使用哪种编码? 当我有这样的C++代码: std::string narrow( "This is a narrow source string" ); std::string n2( "Win-1252 (that's the encoding we use for source files): ä,ö,ü,ß,€, ..." ); // What encoding should I pass to Win32's `MultiByteToWideChar` function // to convert these string to a propoer wchar_t (= UTF-16 on Windows)?,c++,windows,winapi,visual-c++,character-encoding,C++,Windows,Winapi,Visual C++,Character Encoding,如果Win-1252是我们cpp文件的(隐式)编码,我是否可以始终假定它?Visual C++编译器如何决定源文件采用的字符编码 如果开发人员使用一台“普通”文本文件默认为另一种单字节/多字节编码的机器,会发生什么 我假设编码只是用来编译代码的机器上的一个问题?也就是说,一旦构建了可执行文件,将静态字符串从固定的窄编码转换为Windows的UTF-16 wchar\t将始终产生相同的结果,而不管用户PC上的语言/区域设置是什么?语言规范只是说源字符是以实现定义的方式映射的。您需要查阅正在使用的编

如果Win-1252是我们cpp文件的(隐式)编码,我是否可以始终假定它?Visual C++编译器如何决定源文件采用的字符编码

如果开发人员使用一台“普通”文本文件默认为另一种单字节/多字节编码的机器,会发生什么


我假设编码只是用来编译代码的机器上的一个问题?也就是说,一旦构建了可执行文件,将静态字符串从固定的窄编码转换为Windows的UTF-16 wchar\t将始终产生相同的结果,而不管用户PC上的语言/区域设置是什么?

语言规范只是说源字符是以实现定义的方式映射的。您需要查阅正在使用的编译器的文档,以查看该实现的定义。例如,微软VisualC++使用指定的代码页。

注释:由于下面的答案是写的,VC++为源代码和执行字符集添加了额外的选项。p>


对于宽文本,VC++将始终生成UTF-16,对于窄文本,VC++将始终从源编码转换为主机(运行编译器的系统)上设置的“非Unicode程序编码”。因此,只要VC++能够正确识别源代码,就可以得到UTF-16和非Unicode程序的编码

为了确定源代码编码,VC++检测所谓的bom。它将识别UTF-16和UTF-8。如果没有BOM表,则假定源代码使用系统对非Unicode程序的编码进行编码

如果这导致使用错误的编码,那么编译器对字符和字符串文本执行的任何转换都将导致ASCII范围之外的任何字符的错误值


一旦程序被编译,那么“是”,就编译时转换而言,语言环境将不再重要,因为数据是静态的

不过,编码对于其他事情可能很重要,例如如果您将其中一个字符串打印到控制台。您必须对控制台正在使用的任何内容执行适当的转换,或者确保控制台设置为接受您正在使用的编码


关于
#pragma setlocale

#pragma setlocale
仅影响到宽文本的转换,它既不通过设置源编码也不通过更改宽执行编码来实现。坦率地说,它的实际作用是可怕的。例如,以下断言失败:


如果您对源代码使用任何Unicode编码,则绝对应该避免这种情况。

如果您需要编码为UTF-16的字符串文字,为什么不使用宽文字而不是窄文字?那你就不会有这个问题了<代码>标准::wstring宽(L“这是一个宽源字符串”);std::wstring w2(L“ä,ö,ü,ß,€,…”
L”“
等同于
wchar\u t[]
,并且基于
wchar\u t
的字符串可以在Windows上保存UTF-16编码的数据。在其他平台上,如Linux,
wchar\u t
是UTF-32,因此您必须在运行时进行转换,例如使用iconv。否则,如果您需要支持多个平台,则应该使用跨平台库(如ICU)以统一的方式处理Unicode字符串。如果您使用C++11,则可以使用
char16_t
u”“
在所有平台上强制使用UTF-16,例如:
std::basic_string utf16(u“这是UTF-16源字符串”)
@Remy-源代码中有一个剧本,strng文本来自于该剧本,而该剧本在源代码中的位置需要使用窄带。然后,在一些传输之后,std::string必须显示在窗口中,在那里我需要一个宽字符串。然后,您必须使用窄文本实际使用的正确编码执行运行时转换。如果可能的话,我建议让窄文本保持UTF-8字节。如果您使用的是C++11,则可以使用
char8\t
u8”“
来实现此目的,否则,对非ASCII字节使用转义序列。无论哪种方式,在转换为UTF-16时,您都可以使用
CP\u UTF8
codepage和
MultiByteToWideChar()
。@Remy-“使用窄文本的正确编码执行运行时转换”-这就是问题所在!我的文字使用哪种编码?我没有C++11/u8,所以我必须使用一个简单的字符串
“…”
-它将是哪种编码?为扩展您的答案干杯!在底部的静态断言示例中,cpp文本文件的编码是什么?既然“Я”和“ß”都在里面,我猜是UTF-8 | 16?@MartinBa是的,UTF-8。我知道为什么会发生这样的事情,但正如我所说的,我很震惊。pragma应该做的是让编译器将该表达式视为
L'ПЇ'!=L‘Гџ’
(即,源中实际的UTF-8字节应解释为CP1251)。我只是觉得VC++更喜欢做的事情令人难以置信。实际上,我根本不确定发生了什么:-)编译器必须读入您的UTF-8文件,并且必须将UTF-8代码点转换为UTF-16代码点。究竟为什么它会基于语言环境pragma将两个不同的UTF-8代码点转换为相同的UTF-16代码点?我相信你,我只是被难倒了,我必须通过哪种机制路由一个代码点,从U+00DF(ß)和U+042F(Я)到同一个UTF-16代码点。它将UTF-8编码字符转换为一个代码页,然后将该编码解释为cp1251。所以“ß”被转换成cp1252,也就是0xDF,“Я”被转换成cp1251,也就是0xDF。然后,在这两种情况下,0xDF都被解释为cp1251,因此编译器实际看到的结果是
L'Я'!=L‘Я’
#pragma setlocale(".1251")
static_assert(L'Я' != L'ß', "wtf...");