如何在c ++中使用utf8字符数组?

时间:2011-05-20 13:06:59

标签: c++ utf-8

是否可以让char *在C ++(VC2010)中使用utf8编码?

例如,如果我的源文件保存在utf8中,我写的是这样的:

const char* c = "aäáéöő";

是否可以将其编码为utf-8?如果是的话,如何使用

char* c2 = new char[strlen("aäáéöő")];

如果字符长度可变,则进行动态分配吗?

5 个答案:

答案 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编码文件 UTF8 file
这是独立于编译器的答案(在Windows上编译) (类似question。)

答案 3 :(得分:1)

请参阅此MSDN文章,该文章讨论了在字符串类型之间进行转换(应该为您提供有关如何使用它们的示例)。涵盖的字符串类型包括char *,wchar_t *,_bstr_t,CComBSTR,CString,basic_string和System.String:

How to: Convert Between Various String Types

答案 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的下一个主要版本。