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

sek*_*t64 14 c++ utf-8

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

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

const char* c = "aäáéö?";
Run Code Online (Sandbox Code Playgroud)

这有可能使它成为utf-8编码?如果是的话,怎么可能使用

char* c2 = new char[strlen("aäáéö?")];
Run Code Online (Sandbox Code Playgroud)

如果字符可以是可变长度的动态分配?

Jam*_*nze 14

窄字符串文字的编码是实现定义的,所以你真的必须阅读文档(如果你能找到它).一个快速的实验表明VC++(VC8,无论如何)和g ++(4.4.2,无论如何)实际上只是复制源文件中的字节; 字符串文字将采用编辑器保存的任何编码.(这显然违反了标准,但似乎是常见做法.)

C++ 11具有UTF-8字符串文字,允许您编写u8"text",并确保"text"以UTF-8编码.但我真的不希望它可靠地运行:问题是,为了做到这一点,编译器必须知道源文件的编码.很可能,编译器编写者将继续忽略该问题,只是从源文件中复制字节,并实现一致性,只需记录源文件必须是UTF-8才能使这些功能正常工作.

  • 通过将源文件的编码方案从UTF-8更改为UTF-16,可以使工作程序变得错误的想法强化了我对C++纯粹混乱的印象!有人请告诉我这不是真的.:( (4认同)
  • @Whitledge任何读取文本的程序在不知道编码的情况下处理输入问题的概念对我来说似乎并不特别令人惊讶; 我不知道怎么会这样.C++标准非常清楚输入字符的给定序列应该发生什么(尽管两个最广泛使用的编译器在这方面忽略了标准),但是对于编译器如何解释编码而言,它没有多少说法.输入.(例如,大多数平台不支持UTF-16.) (3认同)
  • @James Kanze - 显然*不知道*编码会导致问题.那不是我所说的.这听起来像一个程序将使用UTF-8或UTF-16编译,但编译程序的行为将根据编码而有所不同.如果大多数平台不支持UTF-16,那么我想根本就不是这种情况.听起来C++源文件根本不是真正的文本文件,而是与文本有些相似的二进制文件.如果是这种情况,那么"编码"肯定会有所不同,因为它实际上不是文本编码. (2认同)
  • @Bo Persson - 我之前的期望是源文件的编码和目标平台的编码是不同的概念,并且无论编码是什么,字符串文字都会成为字符串数据,无论是为该文字指定还是隐含的任何目标编码.源(只要两者之间的正确映射可用).这意味着源代码文件可以从一种编码转换为另一种编码而不改变生成的编译二进制文件 (2认同)