Unicode 本机C++;和C++/CLI?

Unicode 本机C++;和C++/CLI?,unicode,utf-8,character-encoding,c++-cli,Unicode,Utf 8,Character Encoding,C++ Cli,我有一个奇怪的问题,我相信有解决办法,但我找不到它。谢谢你的帮助 一方面,我有一个名为代码>原生< /COD>的本地C++类,它有一个包含“加重字符”的静态 WCARGYTT < /代码>数组。此数组是常量,并在生成时定义 /// Header file Native { public: static const wchar_t* Array() const { return mArray; } private: static const wchar_t *mArray; };

我有一个奇怪的问题,我相信有解决办法,但我找不到它。谢谢你的帮助

一方面,我有一个名为<>代码>原生< /COD>的本地C++类,它有一个包含“加重字符”的静态<代码> WCARGYTT < /代码>数组。此数组是常量,并在生成时定义

/// Header file
Native
{
public:
    static const wchar_t* Array() const { return mArray; }

private:
    static const wchar_t *mArray;
};

//--------------------------------------------------------------

/// .cpp file
const wchar_t* Native::mArray = {L"This is a description éàçï"};
另一方面,我有一个C++/CLI类,它使用如下数组:

/// C++/CLI use
System::String^ S1 = gcnew System::String( Native::Array() );
System::String^ S2 = gcnew System::String( L"This is a description éàçï" };
问题在于,
S2
给出了这是一个预期的描述,
S1
给出了这是一个描述。我不明白为什么将指针传递到静态数组不会得到与直接给出相同数组相同的结果

我想这是一个编码问题,但我希望
S1
S2
的结果是相同的。你知道如何解决这个问题吗?我必须在我的程序中使用它的方式类似于
S1
,即使用返回常量wchar\u t*的静态方法访问构建时静态数组

谢谢你的帮助


编辑1


<> P>在C++中使用英特尔C++ 13定义字形的最佳方法是什么使它们直接在C++/CLI系统中使用::这可能是我的问题的最终问题。

我没有足够的声誉来添加评论来提出这个问题,因此,如果这似乎不合适,我很抱歉将此作为答案发布

问题可能是编译器将wchar\u t定义为8位?我认为这是可能的,基于这个答案:

为了回答您关于在构建时构建UTF-16阵列的问题(在评论中),我相信您可以通过使用u“…”而不是L“…”(请参阅)将其强制为UTF-16

编辑1: 值得一提的是,我使用Microsoft Visual Studio 10尝试了您的代码(在修复了几个编译错误之后),但没有出现相同的问题(两个字符串都按预期打印)

我不知道它是否对您有帮助,但静态初始化此wchar_t数组的另一种可能方法是使用std::wstring包装文本,然后将数组设置为wstring::c_str()返回的c字符串指针,如下所示:

std::wstring ws(L"This is a description éàçï");
const wchar_t* Native::mArray = ws.c_str();

此编辑的灵感来源于

您得到的结果与UTF-8解释为Windows ANSI Western完全相同,但这对于基于wchar\u t。这是真的密码吗?无论如何,请注意,当您仅通过
Array()
访问它时,不需要单独的
mArray
:只需直接在该函数中返回文本即可。您的“本机数组”包含utf-8编码的文本。当然不适合常量wchar_t*,它应该是utf-16。此错误位于读取文本的任何本机代码中,可能是由于没有正确猜测文本文件的编码或忽略BOM。标准C++错误。@阿尔夫不,这不是真正的代码,不,我不能简单地在数组()中使用数组。我的代码要复杂得多,使用了CRTP等。感谢您对UTF-8和Windows ANSI Western的提示…@HansPassant好吧,给数组一个UTF-16构建时字符串的方法是什么?我(错误地)坚持认为在它前面加上“L”就行了,但事实似乎并非如此。所以` const wchar_t*mArray={?????}@多姆·博:没有真正的代码,它只是猜测。因此,尝试创建一个小的(最小的)但完整的示例。包括您的构建命令和结果。Tim,不,我在Win7 64位上,使用VisualStudio,我的项目使用16位宽的wchar\u t。我尝试了u“…”而不是L“…”,结果出现了语法错误。这很奇怪。我使用英特尔C++ 13,它支持C++ 11.不幸的是,用户定义的文字不受英特尔C++ 13编译器的支持。那么,我应该如何在构建时定义存储在wchar__t*中的UTF-16文本呢?请参阅我上面的“编辑1”,了解填充wchar_t数组的另一种可能方法。嗨,蒂姆,我不知道你是如何成功编译它并获得预期结果的,但感谢你的提示。我看看能不能用。