9

我有一个问题,我需要在 C++ 源代码中的标准字符类型上使用 UTF-8 编码的字符串,如下所示:

char* twochars = "\xe6\x97\xa5\xd1\x88";

通常,如果我想写一个 UTF-8 字符,我需要像上面那样使用八位字节。Visual Studio(我正在使用 VS 2013 Ultimate)中是否有一些东西可以让我只写例如“ĄĘĆŻ”并自动将每个字符转换为多个 UTF-8 八位字节,就像上面的示例一样?或者我应该使用const wchar_t*并找到一个可以将宽字符串转换为 UTF-8 编码的标准字符字符串的库?

如果没有这样的东西,你能推荐任何外部软件吗?我真的不想浏览每个符号/非拉丁字母的字符映射。

对不起我的英语,提前谢谢。

4

2 回答 2

16

您可以使用仍未记录的pragma指令execution_character_set("utf-8")。这样,您的char字符串将在二进制文件中保存为 UTF-8。顺便说一句,此编译指示仅在 Visual C++ 编译器中可用。

#include <iostream>
#include <cstring>

#pragma execution_character_set("utf-8")

using namespace std;

char *five_chars = "ĄĘĆŻ!";

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "This is an UTF-8 string: " << five_chars << endl;
    cout << "...it's 5 characters long" << endl;
    cout << "...but it's " << strlen(five_chars) << " bytes long" << endl;
    return 0;
}
于 2013-11-15T16:30:19.243 回答
2

使用当前版本的 VC++,无法直接在 UTF-8 中编写字符串文字。未来的版本应该有UTF-8 字符串文字

我尝试将非 ASCII 文本直接粘贴到源文件中的字符串文字中,并将文件保存为 UTF-8。在十六进制编辑器中查看源文件确认它已保存为 UTF-8,但这仍然不能满足您的要求。在编译时,这些字节要么被映射到当前代码页中的一个字符,要么你得到一个警告。

因此,现在创建字符串文字的最可移植的方法是像您一直在做的那样显式地编写八位位组。

如果您想进行运行时转换,有几个选项。

  1. Windows API 具有WideCharToMultiByte,它可以将文本作为 UTF-16 并将其转换为多字节编码,如 UTF-8。
  2. 如果您使用的是足够新版本的编译器和 C++ 运行时,则可以使用std::codecvt将宽字符串转换为 UTF-8。

您可以使用其中一种技术编写一个小实用程序来执行转换并将它们作为字符串文字所需的显式八位字节输出。然后,您可以将输出复制并粘贴到您的源代码中。

于 2013-11-14T21:57:37.577 回答