在C++(VC2010)中,是否可以使用char *
处理UTF8编码?
例如,如果我的源文件以UTF8保存,并且我像这样编写:
const char* c = "aäáéöő";
是否有可能将其转换为UTF-8编码? 如果可以,如何使用?
char* c2 = new char[strlen("aäáéöő")];
如何进行动态内存分配以便字符长度可变?
窄字符串文字的编码是由实现定义的,因此你需要阅读文档(如果你能找到的话)。一个快速的实验显示,VC++(至少是VC8)和g ++(4.4.2,无论如何)实际上只是从源文件中复制字节;字符串字面量将使用编辑器保存它的任何编码。 这显然违反了标准,但似乎是常见的做法。
C++11有UTF-8字符串文字,允许您编写u8"text"
,并确保"text"
被编码为UTF-8。但我并不真正希望它能够可靠地工作:问题在于,为了做到这一点,编译器必须知道源文件的编码方式。很可能,编译器编写者将继续忽略这个问题,只是复制源文件的字节,并通过记录源文件必须使用UTF-8才能使这些功能起作用来实现符合性。
/charset:
开关的编译器也是合规的。将其定义为UTF8或Latin1取决于输入字符集的编译器也是合规的 - 标准在这方面没有太多强制要求,只要有文档说明即可。 - MSalters\u1234
,其中1234是代码点值。针对VisualStudio 2010 SP1有一个热补丁可以帮助解决问题:http://support.microsoft.com/kb/980263。
该热补丁添加了一个编译指示符,用于覆盖Visual Studio对char类型的字符编码控制:
#pragma execution_character_set("utf-8")
可以将文件保存为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äáéöő
\0
,但仅当文本本身包含\0
时才会出现,这对于大多数“文本”来说是没有意义的。 - Mooing Duck