Char字符串编码本机C ++和C ++ / CLI之间的差异?

时间:2014-08-22 13:51:58

标签: unicode utf-8 character-encoding c++-cli

我有一个奇怪的问题,我相信有一个解决方案,但我找不到它。感谢您的帮助。

一方面,我有一个名为Native本机C ++ 类,它有一个包含重音字符的静态wchar_t数组。此数组是const并在构建时定义。

/// 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给出这是一个描述ÃÃÃÃÃÃ< / strong>即可。我不明白为什么将指针传递给静态数组不会给出与直接给出相同数组相同的结果???

我想这是一个编码问题,但我预计S1S2的结果会相同。你知道如何解决这个问题吗?我必须在我的程序中使用它的方式就像S1,即通过使用返回const wchar_t *的静态方法访问构建时静态数组。

感谢您的帮助!


编辑1

在C ++中使用英特尔C ++ 13.0在构建时定义文字的最佳方法是什么,使它们可以在C ++ / CLI System :: String构造函数中直接使用?这可能是我问题的最终问题。

1 个答案:

答案 0 :(得分:2)

我没有足够的声誉来添加评论来提出这个问题,所以如果这看起来不合适,我很抱歉将其作为答案发布。

问题是您的编译器将wchar_t定义为8位吗?我基于这个答案是可能的:

Should I use wchar_t when using UTF-8?

要回答关于在构建时构建UTF-16阵列的问题(在评论中),我相信你可以使用u“...”来强制它为UTF-16而不是L“。 ..“(见http://en.cppreference.com/w/cpp/language/string_literal

编辑1: 为了它的价值,我使用Microsoft Visual Studio 10尝试了你的代码(在修复了一些编译错误之后)并且没有相同的问题(两个字符串都按预期打印)。

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

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

此修改的灵感来自Dynamic wchar_t array (C++ beginner)