是否可以让char *
在C ++(VC2010)中使用utf8编码?
例如,如果我的源文件保存在utf8中,我写的是这样的:
const char* c = "aäáéöő";
是否可以将其编码为utf-8?如果是的话,如何使用
char* c2 = new char[strlen("aäáéöő")];
如果字符长度可变,则进行动态分配吗?
答案 0 :(得分:13)
窄字符串文字的编码是实现定义的,所以你真的必须阅读文档(如果你能找到它)。一个快速的实验表明VC ++(VC8,无论如何)和g ++(4.4.2,无论如何)实际上只是复制源文件中的字节;字符串文字将采用编辑器保存的任何编码。(这显然违反了标准,但似乎是常见做法。)
C ++ 11具有UTF-8字符串文字,允许您编写u8"text"
,并确保"text"
以UTF-8编码。但我真的不希望它可靠地运行:问题是,为了做到这一点,编译器必须知道源文件的编码。很可能,编译器编写者将继续忽略该问题,只是从源文件中复制字节,并实现一致性,只需记录源文件必须是UTF-8才能使这些功能正常工作。
答案 1 :(得分:4)
如果要放入字符串中的文本位于源代码中,请确保源代码文件为UTF-8。
如果不起作用,请尝试使用\u1234
,其中1234为代码点值。
您也可以尝试使用UTF8-CPP。
看一下这个答案:Using Unicode in C++ source code
答案 2 :(得分:2)
可以将文件保存为UTF-8 ,无BOM 签名编码。
//Save As UTF8 without BOM signature
#include<stdio.h>
#include<windows.h>
int main(){
SetConsoleOutputCP(65001);
char *c1 = "aäáéöő";
char *c2 = new char[strlen("aäáéöő")];
strcpy(c2,c1);
printf("%s\n",c1);
printf("%s\n",c2);
}
结果:
D:\Debug>program
aäáéöő
aäáéöő
重定向程序的结果实际上是UTF8编码文件
这是独立于编译器的答案(在Windows上编译)
(类似question。)
答案 3 :(得分:1)
请参阅此MSDN文章,该文章讨论了在字符串类型之间进行转换(应该为您提供有关如何使用它们的示例)。涵盖的字符串类型包括char *,wchar_t *,_bstr_t,CComBSTR,CString,basic_string和System.String:
答案 4 :(得分:1)
VisualStudio 2010 SP1有一个修补程序可以提供帮助:http://support.microsoft.com/kb/980263。
此修补程序添加了一个pragma,以覆盖visual studio控制char类型的字符编码:
#pragma execution_character_set("utf-8")
如果没有编译指示,基于char *的文字通常被解释为默认代码页(通常为1252)
这应该最终被C ++ 0x指定的新字符串文字前缀修饰符取代(u8,u和U分别用于utf-8,utf-16和utf-32),理想情况下将在2010年后Visual Studio的下一个主要版本。