C++ 将unicode字符串定义为字节数组

C++ 将unicode字符串定义为字节数组,c++,unicode,C++,Unicode,假设我们有windows-1251编码的main.cpp文件,其内容如下: int main() { wchar_t* ws = L"котэ"; //cat in russian return 0; } 如果我们在VisualStudio中编译它,一切都很好,但我们将使用GCC编译它,源代码的默认编码是UTF-8。当然,我们可以为编译器转换文件编码或设置选项“-finput charset=windows-1251”,但如果不是呢?可以通过将原始文本替换为十六进制UTF3

假设我们有windows-1251编码的main.cpp文件,其内容如下:

int main()
{
     wchar_t* ws = L"котэ"; //cat in russian
     return 0;
}
如果我们在VisualStudio中编译它,一切都很好,但我们将使用GCC编译它,源代码的默认编码是UTF-8。当然,我们可以为编译器转换文件编码或设置选项“-finput charset=windows-1251”,但如果不是呢?可以通过将原始文本替换为十六进制UTF32字节来实现这一点:

int main()
    {
         wchar_t* ws = (wchar_t*)"\x3A\x04\x00\x00\x3E\x04\x00\x00\x42\x04\x00\x00\x4D\x04\x00\x00\x00\x00\x00\x00"; //cat in russian
         return 0;
    }
但有点夸张:4个字母变成了20个字节((


还有其他方法吗?

您需要的是使用GCC和VS都能理解的文件编码。在我看来,以UTF-8编码保存文件是前进的方向


另请参见:

使用
wchar_t*ws=L“аэ”
@πάνταῥεῖ, 不正确。仅当文件main.cpp具有utf8时,该选项才有效encoding@AlekDepler那么,@πνταῥεῖ, 没有C++ 11,我很确定问题。remains@SamVarshavchik,乌克兰语中的“cat”是“κiц”,请完成学业。我知道这一点,乍一看,这是一个简单而明显的问题。但问题是:如果你试图定义单字节非英语字符串(char*s=“κцэ”;),将其保存在utf8中并在VisualStudio中编译…猜怎么着?您将在该字符串中获得原始utf8字节,而不是与系统语言环境相关的字节,这会导致所有代码中出现各种问题(例如,strlen将无法正确计算长度)@ AlekDepler,你应该保持与使用<代码> char 和<代码> WCARYTT ,否则你肯定会遇到这样的麻烦。如果你必须混合它们,最好是把char字符串保存到ASCII。是的,有很多不同的API:你需要考虑。在VS/Windows中,约定是使用WCH。ar表示任何Unicode(例如文件名),而在Linux中,更常见的是使用char并将其解释为UTF-8。strlen和friends,如您所说,计算字节,而不是Unicode字符-这对于大多数用途来说都是很好的(例如,确定分配或复制的内存量)。如果您想编写可移植代码,您需要小心如何使用Unicode字符串。一种方法是全面使用UTF-8:将文件编码为UTF-8,并全面使用UTF-8字符串(使用char*字符串和/或std::string,并始终将其解释为UTF-8)。然后,您可以使用一个库,例如转换为UTF-16或从UTF-16转换为UTF-16,并获得真正的字符串长度(字符串的Unicode码点数)等。