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である。
二つのコードを貼って中のバイトの値を見てください。
>ASCIIコード.>FFFFFF 8-FFFFFF 9-FFFFFFFF 4-FFFFFFFF 0-FFFFFFFFFF-FFFFFFFF-
CEGUI Stringのコードを見てみます。
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()関数を使った出力方式と同じです。ソースを見てください。
ptr()を呼び出して出力する値はあなたが設定した値です。しかし、ptr()はutf 32タイプのstring pointerを返します。char型のstring pointerに変換します。直接に(char*)を使って強制変換することはできません。強制変換はutf 32の残りの3バイトの値をも取っています。つまり0値です。次の関数を書いて変換します。
例えばこの場所で使ってください。次はluaで使う方法です。
主にCEGUIのStringストレージ方式とCPPのstringストレージ方式が違うだけです。
もう一つの問題はtryに行っていませんでした。つまり、CEGUIのコントロールに中国語を表示させるにはどうすればいいですか?時間があります。
転載先:https://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