CEGUIのStringとC++のstd:stringは互いに変換します。

4127 ワード

原文のリンク:http://www.cnblogs.com/emyueguang/archive/2011/12/06/2277513.html
問題はウィンドウを設定するuserStringから来ています。つまり、wimgr:get Window(「windName」):set UserString(「Another Name」「ルートウィンドウ」)。そしてこの値をgetUserString(Another Name)を使って取得すると、文字化けが表示されます。
CEGUI内部では、utf 32符号化を使用して、String.data()&String.c_を使用することができます。str()は対応するutf-8符号化string pointerを取得する。String.ptr()を使って取得したのは、string pointerである。
二つのコードを貼って中のバイトの値を見てください。
     std::string cppStr("   ");
     printf("ASCII   . \r
"); for (int i = 0; i < cppStr.size(); ++i) { printf("%X - ", cppStr[i]); }
この区間の出力の値は以下の通りです。
>ASCIIコード.>FFFFFF 8-FFFFFF 9-FFFFFFFF 4-FFFFFFFF 0-FFFFFFFFFF-FFFFFFFF-
CEGUI Stringのコードを見てみます。
     String ceguiStr(cppStr.c_str());
     std::cout << std::endl << "CEGUI str. " << std::endl;
     std::cout << std::endl << "   ceguiStr[i]     ." << std::endl;
     for (int i = 0; i < ceguiStr.size(); ++i)
     {
          printf("%X - ", ceguiStr[i]);
     }

     std::cout << std::endl << "   *(ceguiStr.c_str() + i)     " << std::endl;
     for (int i = 0; i < ceguiStr.size(); ++i)
     {
          printf("%X - ", *(ceguiStr.c_str() + i));
     }

     std::cout << std::endl << "   *(ceguiStr.data() + i)     " << std::endl;
     for (int i = 0; i < ceguiStr.size(); ++i)
     {
          printf("%X - ", *(ceguiStr.data() + i));
     }

     std::cout << std::endl << "   *(ceguiStr.ptr() + i)     " << std::endl;
     for (int i = 0; i < ceguiStr.size(); ++i)
     {
          printf("%X - ", *(ceguiStr.ptr() + i));
     }
 上のコードの出力値は以下の通りです。
CEGUI str.>>ceggguiStr[i]を使って出力.>B 8-F 9-B 4-B 0-BF-DA->*(cegiStr.cstr()+i)を使用して出力されます。FFFFFFFF C 8-FFFFFFFFFF 9-FFFFFFFFFF C 2-FFFFFFFF C 2-FFFFFF C 2-FFFFFFFF C 2-FFFFFF C 2-FFFFFFFFFF C 2-FFFFFFFF C 2-FFFFFFFF C 2-FFFFFFFFFF C 2-FFFFFFFF C 2-FFFF C 2-FFFFFFFFFFFFFFFF C 2-FFFFFFFFFFFFFFFF C 2-FFFFFFFFFFFF C 2-Bgggggggggi)の方式出力>B 8-F 9-B 4-B 0-BF-DA-
CEGUIのString,c_が見られます。str()とdata()関数出力の値は同じです。
「i」を使った出力方式はptr()関数を使った出力方式と同じです。ソースを見てください。
     reference     operator[](size_type idx)
     {
          return (ptr()[idx]);
     }
 ここも呼び出されたptr()という関数です。
ptr()を呼び出して出力する値はあなたが設定した値です。しかし、ptr()はutf 32タイプのstring pointerを返します。char型のstring pointerに変換します。直接に(char*)を使って強制変換することはできません。強制変換はutf 32の残りの3バイトの値をも取っています。つまり0値です。次の関数を書いて変換します。
char* CEGUIStringToCPPString(CEGUI::String ceguiString)
{
     char* asciiBuffer = (char*)malloc((ceguiString.size()+1)*sizeof(char));
     memset(asciiBuffer, 0xFF, ceguiString.size()+1);
     for (int i = 0; i < ceguiString.size(); ++i)
     {
          asciiBuffer[i] &= ceguiString[i];
          //        *(ceguiString.ptr() + i);
     }
     asciiBuffer[ceguiString.size()] = 0;
     return asciiBuffer;
}
 
例えばこの場所で使ってください。次はluaで使う方法です。
win:setUserString("AnotherName","   ");     --  ,              ,       ascii    
print(CEGUIStringToCPPString(win:getUserString("AnotherName"))); -- : ,
C++のstringがCEGUIのStringに移行すると、これは簡単で、CEGUI:String cegg String=cppString.cnstr
主にCEGUIのStringストレージ方式とCPPのstringストレージ方式が違うだけです。
もう一つの問題はtryに行っていませんでした。つまり、CEGUIのコントロールに中国語を表示させるにはどうすればいいですか?時間があります。
転載先:https://www.cnblogs.com/emyueguang/archive/2011/12/06/2277513.html