Update:
我决定没有保证的方法可以做到这一点。我下面介绍的解决方案适用于英文版 VC2003,但在使用日文版 VC2003(或者可能是日文操作系统)编译时会失败。无论如何,不能依赖它来工作。请注意,即使将所有内容声明为 L"" 字符串也不起作用(并且在 gcc 中很痛苦,如下所述)。
相反,我相信您只需要硬着头皮将所有文本移动到数据文件中并从那里加载它。我现在通过以下方式存储和访问 INI 文件中的文本简单初始化 http://code.jellycan.com/simpleini/(跨平台 INI 文件库)。至少可以保证它可以工作,因为所有文本都在程序之外。
原来的:
我自己回答这个问题,因为似乎只有埃文明白这个问题。关于什么是 Unicode 以及如何使用 wchar_t 的答案与此问题无关,因为这与国际化无关,也不是对 Unicode 字符编码的误解。我很感谢你尝试提供帮助,如果我不够清楚,我深表歉意。
问题是我有源文件需要在各种平台和编译器下交叉编译。该程序进行 UTF-8 处理。它不关心任何其他编码。我想要 UTF-8 格式的字符串文字,就像目前使用 gcc 和 vc2003 一样。用VC2008怎么做? (即向后兼容的解决方案)。
这是我发现的:
海湾合作委员会(v4.3.2 20081105):
- 字符串文字按原样使用(原始字符串)
- 支持UTF-8编码的源文件
- 源文件不得包含 UTF-8 BOM
vc2003:
- 字符串文字按原样使用(原始字符串)
- 支持UTF-8编码的源文件
- 源文件可能有也可能没有 UTF-8 BOM(没关系)
vc2005+:
- 字符串文字由编译器处理(无原始字符串)
- char 字符串文字被重新编码为指定的区域设置
- 不支持 UTF-8 作为目标区域设置
- 源文件必须具有 UTF-8 BOM
因此,简单的答案是,对于这个特定目的,VC2005+ 已损坏并且不提供向后兼容的编译路径。将 Unicode 字符串放入已编译程序的唯一方法是通过 UTF-8 + BOM + wchar,这意味着我需要在使用时将所有字符串转换回 UTF-8。
没有任何简单的跨平台方法将 wchar 转换为 UTF-8,例如,wchar 的大小和编码是什么?在 Windows 上,UTF-16。在其他平台上?它有所不同。请参阅重症监护室项目 http://icu-project.org/docs/papers/unicode_wchar_t.html了解一些细节。
最后,我决定避免在除 vc2005+ 之外的所有编译器上使用如下所示的源代码进行转换成本。
#if defined(_MSC_VER) && _MSC_VER > 1310
// Visual C++ 2005 and later require the source files in UTF-8, and all strings
// to be encoded as wchar_t otherwise the strings will be converted into the
// local multibyte encoding and cause errors. To use a wchar_t as UTF-8, these
// strings then need to be convert back to UTF-8. This function is just a rough
// example of how to do this.
# define utf8(str) ConvertToUTF8(L##str)
const char * ConvertToUTF8(const wchar_t * pStr) {
static char szBuf[1024];
WideCharToMultiByte(CP_UTF8, 0, pStr, -1, szBuf, sizeof(szBuf), NULL, NULL);
return szBuf;
}
#else
// Visual C++ 2003 and gcc will use the string literals as is, so the files
// should be saved as UTF-8. gcc requires the files to not have a UTF-8 BOM.
# define utf8(str) str
#endif
请注意,此代码只是一个简化的示例。生产使用需要以多种方式清理它(线程安全、错误检查、缓冲区大小检查等)。
其用法类似于以下代码。在我对 gcc、vc2003 和 vc2008 的测试中,它可以干净地编译并正常工作:
std::string mText;
mText = utf8("Chinese (Traditional)");
mText = utf8("中国語 (繁体)");
mText = utf8("중국어 (번체)");
mText = utf8("Chinês (Tradicional)");