Понимать макросы преобразования строк и приведение типов строк к строке в стиле C и CString
В настоящее время я работаю в приложениях MFC Visual Studio. И я в основном использую строку для регистрации и отладки, которая может содержать китайские символы. Поэтому я всегда использую набор символов Unicode по умолчанию. А процедура вывода, будь то окно вывода или текстовый файл, обычно вращается вокруг строки в стиле C, CString и ostringsteam. Хотя я читал о кодировке Unicode и знаю, как работает идентификатор Unicode или _Unicode. Я до сих пор не совсем понимаю, как строка C-стиля и CString хранятся, конвертируются и выводятся.
Начальный вопрос
CString CStr = _T("你好"); // Hello. U+4F60 U+597D
char* LPSTR1 ="我是刘嘉森\n" ; //I am Jiasen Liu. U+6211 U+662F U+5218 U+5609 U+68EE U+000A
CStr += LPSTR1;
std::ostringstream os;
std::wostringstream wos;
os << CT2CA(CStr);
wos << LPCWSTR(CStr);
OutputDebugStringA(os.str().c_str());
OutputDebugStringW(wos.str().c_str());
Приведенные выше сегменты кода используют два способа вывода строки в окно вывода. И оба дают одинаковый результат:
你好 我 是 刘嘉森 你好 我 是 刘嘉森
Поскольку я использую CT2CA в первом методе, мне интересно, как строка символов ANSI может успешно представлять строку символов Unicode, состоящую из символов CJK.
Расширенный вопрос
Google не сильно помог мне в понимании поведения в первоначальном вопросе, а также в общей идее о том, как каждый персонаж управляется внутри. Поэтому я решил провести тест со всеми возможными кросс-комбинациями преобразования строк и приведения типов с использованием cout/wcout для вывода, и, надеюсь, получить более глубокое понимание и решить вопросы, связанные с преобразованиями строк раз и навсегда. Тест проводился в консольном приложении с общими заголовочными файлами для MFC, поскольку я хотел использовать CString, но с более простым методом вывода. Результаты немного прояснили ситуацию, но также породили больше вопросов.
Следующие два блока - это сегмент кода и соответствующий вывод в окне консоли.
LPCWSTR myStr = _T("How are you?");
CString myCStr = myStr;
LPCWSTR myLPCWSTR0 = myStr;
LPSTR myLPSTR1 = CT2A(myStr);
LPSTR myLPSTR1_1 = CT2CA(myStr);
LPCSTR myLPCSTR1 = CT2CA(myStr);
LPCSTR myLPCSTR1_1 = CT2A(myStr);
LPWSTR myLPWSTR1 = CT2W(myStr);
LPCWSTR myLPCWSTR1 = CT2CW(myStr);
LPCWSTR myLPCWSTR1_1 = CT2W(myStr);
LPCWSTR myLPCWSTR2 = myCStr;
LPSTR myLPSTR3 = CT2A(myCStr);
LPSTR myLPSTR3_1 = CT2CA(myCStr);
LPCSTR myLPCSTR3 = CT2CA(myCStr);
LPCSTR myLPCSTR3_1 = CT2A(myCStr);
LPWSTR myLPWSTR3 = CT2W(myCStr);
LPCWSTR myLPCWSTR3 = CT2CW(myCStr);
LPCWSTR myLPCWSTR3_1 = CT2W(myCStr);
std::cout << endl << "*********Following is cout:********" << endl;
std::cout << "1. "<< "myStr: " << myStr << " wcslen: " << wcslen(myStr) << " sizeof: " << sizeof(myStr) << endl;
std::cout << "2. "<< "(LPCWSTR)myStr: " << (LPCWSTR)myStr << " wcslen: " << wcslen((LPCWSTR)myStr) << " sizeof: " << sizeof((LPCWSTR)myStr) << endl;
std::cout << "3. "<< "LPCWSTR = myStr: " << myLPCWSTR0 << " wcslen: " << wcslen(myLPCWSTR0) << " sizeof: " << sizeof(myLPCWSTR0) << endl;
std::cout << "4. "<< "(LPSTR)myStr: " << (LPSTR)myStr << " strlen: " << strlen((LPSTR)myStr) << " sizeof: " << sizeof((LPSTR)myStr) << endl;
std::cout << "5. "<< "(LPCSTR)myStr: " << (LPCSTR)myStr << " strlen: " << strlen((LPCSTR)myStr) << " sizeof: " << sizeof((LPCSTR)myStr) << endl;
std::cout << endl;
std::cout << "6. "<< "CT2CA(myStr): " << CT2CA(myStr) << " strlen: " << strlen(CT2CA(myStr)) << " sizeof: " << sizeof(CT2CA(myStr)) << endl;
std::cout << "7. "<< "CT2A(myStr): " << CT2A(myStr) << " strlen: " << strlen(CT2A(myStr)) << " sizeof: " << sizeof(CT2A(myStr)) << endl;
std::cout << "8. "<< "CT2W(myStr): " << CT2W(myStr) << " wcslen: " << wcslen(CT2W(myStr)) << " sizeof: " << sizeof(CT2W(myStr)) << endl;
std::cout << "9. "<< "CT2CW(myStr): " << CT2CW(myStr) << " wcslen: " << wcslen(CT2CW(myStr)) << " sizeof: " << sizeof(CT2CW(myStr)) << endl;
std::cout << endl;
std::cout << "10. "<< "(LPSTR)CT2A(myStr): " << (LPSTR)CT2A(myStr) << " strlen: " << strlen((LPSTR)CT2A(myStr)) << " sizeof: " << sizeof((LPSTR)CT2A(myStr)) << endl;
std::cout << "11. "<< "(LPSTR)CT2CA(myStr): " << (LPSTR)CT2CA(myStr) << " strlen: " << strlen((LPSTR)CT2CA(myStr)) << " sizeof: " << sizeof((LPSTR)CT2CA(myStr)) << endl;
std::cout << "12. "<< "(LPCSTR)CT2CA(myStr): " << (LPCSTR)CT2CA(myStr) << " strlen: " << strlen((LPCSTR)CT2CA(myStr)) << " sizeof: " << sizeof((LPCSTR)CT2CA(myStr)) << endl;
std::cout << "13. "<< "(LPCSTR)CT2A(myStr): " << (LPCSTR)CT2A(myStr) << " strlen: " << strlen((LPCSTR)CT2A(myStr)) << " sizeof: " << sizeof((LPCSTR)CT2A(myStr)) << endl;
std::cout << "14. "<< "(LPWSTR)CT2W(myStr): " << (LPWSTR)CT2W(myStr) << " wcslen: " << wcslen((LPWSTR)CT2W(myStr)) << " sizeof: " << sizeof((LPWSTR)CT2W(myStr)) << endl;
std::cout << "15. "<< "(LPCWSTR)CT2CW(myStr): " << (LPCWSTR)CT2CW(myStr) << " wcslen: " << wcslen((LPCWSTR)CT2CW(myStr)) << " sizeof: " << sizeof((LPCWSTR)CT2CW(myStr)) << endl;
std::cout << "16. "<< "(LPCWSTR)CT2W(myStr): " << (LPCWSTR)CT2W(myStr) << " wcslen: " << wcslen((LPCWSTR)CT2W(myStr)) << " sizeof: " << sizeof((LPCWSTR)CT2W(myStr)) << endl;
std::cout << endl;
std::cout << "17. "<< "LPSTR = CT2A(myStr): " << myLPSTR1 << " strlen: " << strlen(myLPSTR1) << " sizeof: " << sizeof(myLPSTR1) << endl;
std::cout << "18. "<< "LPSTR = CT2CA(myStr): " << myLPSTR1_1 << " strlen: " << strlen(myLPSTR1_1) << " sizeof: " << sizeof(myLPSTR1_1) << endl;
std::cout << "19. "<< "LPCSTR = CT2CA(myStr): " << myLPCSTR1 << " strlen: " << strlen(myLPCSTR1) << " sizeof: " << sizeof(myLPCSTR1) << endl;
std::cout << "20. "<< "LPCSTR = CT2A(myStr): " << myLPCSTR1_1 << " strlen: " << strlen(myLPCSTR1_1) << " sizeof: " << sizeof(myLPCSTR1_1) << endl;
std::cout << "21. "<< "LPWSTR = CT2W(myStr): " << myLPWSTR1 << " wcslen: " << wcslen(myLPWSTR1) << " sizeof: " << sizeof(myLPWSTR1) << endl;
std::cout << "22. "<< "LPCWSTR = CT2CW(myStr): " << myLPCWSTR1 << " wcslen: " << wcslen(myLPCWSTR1) << " sizeof: " << sizeof(myLPCWSTR1) << endl;
std::cout << "23. "<< "LPCWSTR = CTCW(myStr): " << myLPCWSTR1_1 << " wcslen: " << wcslen(myLPCWSTR1_1) << " sizeof: " << sizeof(myLPCWSTR1_1) << endl;
std::cout << endl;
std::cout << endl;
std::cout << "24. "<< "myCStr: " << myCStr << " wcslen: " << wcslen(myCStr) << " sizeof: " << sizeof(myCStr) << endl;
std::cout << "25. "<< "(LPCWSTR)myCStr: " << (LPCWSTR)myCStr << " wcslen: " << wcslen((LPCWSTR)myCStr) << " sizeof: " << sizeof((LPCWSTR)myCStr) << endl;
std::cout << "26. "<< "LPCWSTR = myCStr: " << myLPCWSTR2 << " wcslen: " << wcslen(myLPCWSTR1) << " sizeof: " << sizeof(myLPCWSTR1) << endl;
std::cout << endl;
std::cout << "27. "<< "CT2A(myCStr): " << CT2A(myCStr) << " strlen: " << strlen(CT2A(myCStr)) << " sizeof: " << sizeof(CT2A(myCStr)) << endl;
std::cout << "28. "<< "CT2CA(myCStr): " << CT2CA(myCStr) << " strlen: " << strlen(CT2CA(myCStr)) << " sizeof: " << sizeof(CT2CA(myCStr)) << endl;
std::cout << "29. "<< "CT2W(myCStr): " << CT2W(myCStr) << " strlen: " << wcslen(CT2W(myCStr)) << " sizeof: " << sizeof(CT2W(myCStr)) << endl;
std::cout << "30. "<< "CT2CW(myCStr): " << CT2CW(myCStr) << " strlen: " << wcslen(CT2CW(myCStr)) << " sizeof: " << sizeof(CT2CW(myCStr)) << endl;
std::cout << endl;
std::cout << "31. "<< "(LPSTR)CT2CA(myCStr): " << (LPSTR)CT2A(myCStr) << " strlen: " << strlen((LPSTR)CT2A(myCStr)) << " sizeof: " << sizeof((LPSTR)CT2A(myCStr)) << endl;
std::cout << "32. "<< "(LPSTR)CT2CA(myCStr): " << (LPSTR)CT2A(myCStr) << " strlen: " << strlen((LPSTR)CT2A(myCStr)) << " sizeof: " << sizeof((LPSTR)CT2A(myCStr)) << endl;
std::cout << "33. "<< "(LPCSTR)CT2CA(myCStr): " << (LPCSTR)CT2CA(myCStr) << " strlen: " << strlen((LPCSTR)CT2CA(myCStr)) << " sizeof: " << sizeof((LPCSTR)CT2CA(myCStr)) << endl;
std::cout << "34. "<< "(LPCSTR)CT2CA(myCStr): " << (LPCSTR)CT2CA(myCStr) << " strlen: " << strlen((LPCSTR)CT2CA(myCStr)) << " sizeof: " << sizeof((LPCSTR)CT2CA(myCStr)) << endl;
std::cout << "35. "<< "(LPWSTR)CT2W(myCStr): " << (LPWSTR)CT2W(myCStr) << " wcslen: " << wcslen((LPWSTR)CT2W(myCStr)) << " sizeof: " << sizeof((LPWSTR)CT2W(myCStr)) << endl;
std::cout << "36. "<< "(LPCWSTR)CT2CW(myCStr): " << (LPCWSTR)CT2CW(myCStr) << " wcslen: " << wcslen((LPCWSTR)CT2CW(myCStr)) << " sizeof: " << sizeof((LPCWSTR)CT2CW(myCStr)) << endl;
std::cout << "37. "<< "(LPCWSTR)CT2W(myCStr): " << (LPCWSTR)CT2W(myCStr) << " wcslen: " << wcslen((LPCWSTR)CT2W(myCStr)) << " sizeof: " << sizeof((LPCWSTR)CT2W(myCStr)) << endl;
std::cout << "38. "<< "LPSTR = CT2A(myCStr): " << myLPSTR3 << " strlen: " << strlen(myLPCSTR3) << " sizeof: " << sizeof(myLPCSTR3) << endl;
std::cout << "39. "<< "LPSTR = CT2CA(myCStr): " << myLPSTR3_1 << " strlen: " << strlen(myLPCSTR3_1) << " sizeof: " << sizeof(myLPCSTR3_1) << endl;
std::cout << "40. "<< "LPCSTR = CT2CA(myCStr): " << myLPCSTR3 << " strlen: " << strlen(myLPCSTR3) << " sizeof: " << sizeof(myLPCSTR3) << endl;
std::cout << "41. "<< "LPCSTR = CT2A(myCStr): " << myLPCSTR3_1 << " strlen: " << strlen(myLPCSTR3_1) << " sizeof: " << sizeof(myLPCSTR3_1) << endl;
std::cout << "42. "<< "LPWSTR = CT2W(myCStr): " << myLPWSTR3 << " wcslen: " << wcslen(myLPCWSTR3) << " sizeof: " << sizeof(myLPCWSTR3) << endl;
std::cout << "43. "<< "LPCWSTR = CT2CW(myCStr): " << myLPCWSTR3 << " wcslen: " << wcslen(myLPCWSTR3) << " sizeof: " << sizeof(myLPCWSTR3) << endl;
std::cout << "44. "<< "LPCWSTR = CT2W(myCStr): " << myLPCWSTR3_1 << " wcslen: " << wcslen(myLPCWSTR3_1) << " sizeof: " << sizeof(myLPCWSTR3_1) << endl;
std::wcout << endl << "*********Following is wcout:********" << endl;
std::wcout << "45. "<< "myStr: " << myStr << " wcslen: " << wcslen(myStr) << " sizeof: " << sizeof(myStr) << endl;
std::wcout << "46. "<< "(LPCWSTR)myStr: " << (LPCWSTR)myStr << " wcslen: " << wcslen((LPCWSTR)myStr) << " sizeof: " << sizeof((LPCWSTR)myStr) << endl;
std::wcout << "47. "<< "LPCWSTR = myStr: " << myLPCWSTR0 << " wcslen: " << wcslen(myLPCWSTR0) << " sizeof: " << sizeof(myLPCWSTR0) << endl;
std::wcout << "48. "<< "(LPSTR)myStr: " << (LPSTR)myStr << " strlen: " << strlen((LPSTR)myStr) << " sizeof: " << sizeof((LPSTR)myStr) << endl;
std::wcout << "49. "<< "(LPCSTR)myStr: " << (LPCSTR)myStr << " strlen: " << strlen((LPCSTR)myStr) << " sizeof: " << sizeof((LPCSTR)myStr) << endl;
std::wcout << endl;
std::wcout << "50. "<< "CT2CA(myStr): " << CT2CA(myStr) << " strlen: " << strlen(CT2CA(myStr)) << " sizeof: " << sizeof(CT2CA(myStr)) << endl;
std::wcout << "51. "<< "CT2A(myStr): " << CT2A(myStr) << " strlen: " << strlen(CT2A(myStr)) << " sizeof: " << sizeof(CT2A(myStr)) << endl;
std::wcout << "52. "<< "CT2W(myStr): " << CT2W(myStr) << " wcslen: " << wcslen(CT2W(myStr)) << " sizeof: " << sizeof(CT2W(myStr)) << endl;
std::wcout << "53. "<< "CT2CW(myStr): " << CT2CW(myStr) << " wcslen: " << wcslen(CT2CW(myStr)) << " sizeof: " << sizeof(CT2CW(myStr)) << endl;
std::wcout << endl;
std::wcout << "54. "<< "(LPSTR)CT2A(myStr): " << (LPSTR)CT2A(myStr) << " strlen: " << strlen((LPSTR)CT2A(myStr)) << " sizeof: " << sizeof((LPSTR)CT2A(myStr)) << endl;
std::wcout << "55. "<< "(LPSTR)CT2CA(myStr): " << (LPSTR)CT2CA(myStr) << " strlen: " << strlen((LPSTR)CT2CA(myStr)) << " sizeof: " << sizeof((LPSTR)CT2CA(myStr)) << endl;
std::wcout << "56. "<< "(LPCSTR)CT2CA(myStr): " << (LPCSTR)CT2CA(myStr) << " strlen: " << strlen((LPCSTR)CT2CA(myStr)) << " sizeof: " << sizeof((LPCSTR)CT2CA(myStr)) << endl;
std::wcout << "57. "<< "(LPCSTR)CT2A(myStr): " << (LPCSTR)CT2A(myStr) << " strlen: " << strlen((LPCSTR)CT2A(myStr)) << " sizeof: " << sizeof((LPCSTR)CT2A(myStr)) << endl;
std::wcout << "58. "<< "(LPWSTR)CT2W(myStr): " << (LPWSTR)CT2W(myStr) << " wcslen: " << wcslen((LPWSTR)CT2W(myStr)) << " sizeof: " << sizeof((LPWSTR)CT2W(myStr)) << endl;
std::wcout << "59. "<< "(LPCWSTR)CT2CW(myStr): " << (LPCWSTR)CT2CW(myStr) << " wcslen: " << wcslen((LPCWSTR)CT2CW(myStr)) << " sizeof: " << sizeof((LPCWSTR)CT2CW(myStr)) << endl;
std::wcout << "60. "<< "(LPCWSTR)CT2W(myStr): " << (LPCWSTR)CT2W(myStr) << " wcslen: " << wcslen((LPCWSTR)CT2W(myStr)) << " sizeof: " << sizeof((LPCWSTR)CT2W(myStr)) << endl;
std::wcout << endl;
std::wcout << "61. "<< "LPSTR = CT2A(myStr): " << myLPSTR1 << " strlen: " << strlen(myLPSTR1) << " sizeof: " << sizeof(myLPSTR1) << endl;
std::wcout << "62. "<< "LPSTR = CT2CA(myStr): " << myLPSTR1_1 << " strlen: " << strlen(myLPSTR1_1) << " sizeof: " << sizeof(myLPSTR1_1) << endl;
std::wcout << "63. "<< "LPCSTR = CT2CA(myStr): " << myLPCSTR1 << " strlen: " << strlen(myLPCSTR1) << " sizeof: " << sizeof(myLPCSTR1) << endl;
std::wcout << "64. "<< "LPCSTR = CT2A(myStr): " << myLPCSTR1_1 << " strlen: " << strlen(myLPCSTR1_1) << " sizeof: " << sizeof(myLPCSTR1_1) << endl;
/*std::wcout << "65. "<< "LPWSTR = CT2W(myStr): " << myLPWSTR1 << " wcslen: " << wcslen(myLPWSTR1) << " sizeof: " << sizeof(myLPWSTR1) << endl;*/
std::wcout << "66. "<< "LPCWSTR = CT2CW(myStr): " << myLPCWSTR1 << " wcslen: " << wcslen(myLPCWSTR1) << " sizeof: " << sizeof(myLPCWSTR1) << endl;
/*std::wcout << "67. "<< "LPCWSTR = CTCW(myStr): " << myLPCWSTR1_1 << " wcslen: " << wcslen(myLPCWSTR1_1) << " sizeof: " << sizeof(myLPCWSTR1_1) << endl;*/
std::wcout << endl;
std::wcout << endl;
std::wcout << "68. "<< "myCStr: " << myCStr << " wcslen: " << wcslen(myCStr) << " sizeof: " << sizeof(myCStr) << endl;
std::wcout << "69. "<< "(LPCWSTR)myCStr: " << (LPCWSTR)myCStr << " wcslen: " << wcslen((LPCWSTR)myCStr) << " sizeof: " << sizeof((LPCWSTR)myCStr) << endl;
std::wcout << "70. "<< "LPCWSTR = myCStr: " << myLPCWSTR2 << " wcslen: " << wcslen(myLPCWSTR1) << " sizeof: " << sizeof(myLPCWSTR1) << endl;
std::wcout << endl;
std::wcout << "71. "<< "CT2A(myCStr): " << CT2A(myCStr) << " strlen: " << strlen(CT2A(myCStr)) << " sizeof: " << sizeof(CT2A(myCStr)) << endl;
std::wcout << "72. "<< "CT2CA(myCStr): " << CT2CA(myCStr) << " strlen: " << strlen(CT2CA(myCStr)) << " sizeof: " << sizeof(CT2CA(myCStr)) << endl;
std::wcout << "73. "<< "CT2W(myCStr): " << CT2W(myCStr) << " strlen: " << wcslen(CT2W(myCStr)) << " sizeof: " << sizeof(CT2W(myCStr)) << endl;
std::wcout << "74. "<< "CT2CW(myCStr): " << CT2CW(myCStr) << " strlen: " << wcslen(CT2CW(myCStr)) << " sizeof: " << sizeof(CT2CW(myCStr)) << endl;
std::wcout << endl;
std::wcout << "75. "<< "(LPSTR)CT2CA(myCStr): " << (LPSTR)CT2A(myCStr) << " strlen: " << strlen((LPSTR)CT2A(myCStr)) << " sizeof: " << sizeof((LPSTR)CT2A(myCStr)) << endl;
std::wcout << "76. "<< "(LPSTR)CT2CA(myCStr): " << (LPSTR)CT2A(myCStr) << " strlen: " << strlen((LPSTR)CT2A(myCStr)) << " sizeof: " << sizeof((LPSTR)CT2A(myCStr)) << endl;
std::wcout << "77. "<< "(LPCSTR)CT2CA(myCStr): " << (LPCSTR)CT2CA(myCStr) << " strlen: " << strlen((LPCSTR)CT2CA(myCStr)) << " sizeof: " << sizeof((LPCSTR)CT2CA(myCStr)) << endl;
std::wcout << "78. "<< "(LPCSTR)CT2CA(myCStr): " << (LPCSTR)CT2CA(myCStr) << " strlen: " << strlen((LPCSTR)CT2CA(myCStr)) << " sizeof: " << sizeof((LPCSTR)CT2CA(myCStr)) << endl;
std::wcout << "79. "<< "(LPWSTR)CT2W(myCStr): " << (LPWSTR)CT2W(myCStr) << " wcslen: " << wcslen((LPWSTR)CT2W(myCStr)) << " sizeof: " << sizeof((LPWSTR)CT2W(myCStr)) << endl;
std::wcout << "80. "<< "(LPCWSTR)CT2CW(myCStr): " << (LPCWSTR)CT2CW(myCStr) << " wcslen: " << wcslen((LPCWSTR)CT2CW(myCStr)) << " sizeof: " << sizeof((LPCWSTR)CT2CW(myCStr)) << endl;
std::wcout << "81. "<< "(LPCWSTR)CT2W(myCStr): " << (LPCWSTR)CT2W(myCStr) << " wcslen: " << wcslen((LPCWSTR)CT2W(myCStr)) << " sizeof: " << sizeof((LPCWSTR)CT2W(myCStr)) << endl;
std::wcout << "82. "<< "LPSTR = CT2A(myCStr): " << myLPSTR3 << " strlen: " << strlen(myLPCSTR3) << " sizeof: " << sizeof(myLPCSTR3) << endl;
std::wcout << "83. "<< "LPSTR = CT2CA(myCStr): " << myLPSTR3_1 << " strlen: " << strlen(myLPCSTR3_1) << " sizeof: " << sizeof(myLPCSTR3_1) << endl;
std::wcout << "84. "<< "LPCSTR = CT2CA(myCStr): " << myLPCSTR3 << " strlen: " << strlen(myLPCSTR3) << " sizeof: " << sizeof(myLPCSTR3) << endl;
std::wcout << "85. "<< "LPCSTR = CT2A(myCStr): " << myLPCSTR3_1 << " strlen: " << strlen(myLPCSTR3_1) << " sizeof: " << sizeof(myLPCSTR3_1) << endl;
/*std::wcout << "86. "<< "LPWSTR = CT2W(myCStr): " << myLPWSTR3 << " wcslen: " << wcslen(myLPCWSTR3) << " sizeof: " << sizeof(myLPCWSTR3) << endl;*/
std::wcout << "87. "<< "LPCWSTR = CT2CW(myCStr): " << myLPCWSTR3 << " wcslen: " << wcslen(myLPCWSTR3) << " sizeof: " << sizeof(myLPCWSTR3) << endl;
/*std::wcout << "88. "<< "LPCWSTR = CT2W(myCStr): " << myLPCWSTR3_1 << " wcslen: " << wcslen(myLPCWSTR3_1) << " sizeof: " << sizeof(myLPCWSTR3_1) << endl;*/
*********Following is cout:********
1. myStr: 0030ADDC wcslen: 12 sizeof: 4
2. (LPCWSTR)myStr: 0030ADDC wcslen: 12 sizeof: 4
3. LPCWSTR = myStr: 0030ADDC wcslen: 12 sizeof: 4
4. (LPSTR)myStr: H strlen: 1 sizeof: 4
5. (LPCSTR)myStr: H strlen: 1 sizeof: 4
6. CT2CA(myStr): How are you? strlen: 12 sizeof: 132
7. CT2A(myStr): How are you? strlen: 12 sizeof: 132
8. CT2W(myStr): 008FED28 wcslen: 12 sizeof: 260
9. CT2CW(myStr): 0030ADDC wcslen: 12 sizeof: 4
10. (LPSTR)CT2A(myStr): How are you? strlen: 12 sizeof: 4
11. (LPSTR)CT2CA(myStr): How are you? strlen: 12 sizeof: 4
12. (LPCSTR)CT2CA(myStr): How are you? strlen: 12 sizeof: 4
13. (LPCSTR)CT2A(myStr): How are you? strlen: 12 sizeof: 4
14. (LPWSTR)CT2W(myStr): 008FE698 wcslen: 12 sizeof: 4
15. (LPCWSTR)CT2CW(myStr): 0030ADDC wcslen: 12 sizeof: 4
16. (LPCWSTR)CT2W(myStr): 008FE468 wcslen: 12 sizeof: 4
17. LPSTR = CT2A(myStr): 烫烫烫烫 strlen: 136 sizeof: 4
18. LPSTR = CT2CA(myStr): 烫烫烫烫€鴱 strlen: 139 sizeof: 4
19. LPCSTR = CT2CA(myStr): 烫烫烫烫赭? strlen: 139 sizeof: 4
20. LPCSTR = CT2A(myStr): 烫烫烫烫h鲝 strlen: 139 sizeof: 4
21. LPWSTR = CT2W(myStr): 008FF5D0 wcslen: 412 sizeof: 4
22. LPCWSTR = CT2CW(myStr): 0030ADDC wcslen: 12 sizeof: 4
23. LPCWSTR = CTCW(myStr): 008FF4B8 wcslen: 552 sizeof: 4
24. myCStr: 00A30888 wcslen: 12 sizeof: 4
25. (LPCWSTR)myCStr: 00A30888 wcslen: 12 sizeof: 4
26. LPCWSTR = myCStr: 00A30888 wcslen: 12 sizeof: 4
27. CT2A(myCStr): How are you? strlen: 12 sizeof: 132
28. CT2CA(myCStr): How are you? strlen: 12 sizeof: 132
29. CT2W(myCStr): 008FE020 strlen: 12 sizeof: 260
30. CT2CW(myCStr): 00A30888 strlen: 12 sizeof: 4
31. (LPSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
32. (LPSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
33. (LPCSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
34. (LPCSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
35. (LPWSTR)CT2W(myCStr): 008FD990 wcslen: 12 sizeof: 4
36. (LPCWSTR)CT2CW(myCStr): 00A30888 wcslen: 12 sizeof: 4
37. (LPCWSTR)CT2W(myCStr): 008FD760 wcslen: 12 sizeof: 4
38. LPSTR = CT2A(myCStr): 烫烫烫烫隔? strlen: 139 sizeof: 4
39. LPSTR = CT2CA(myCStr): 烫烫烫烫,魪 strlen: 139 sizeof: 4
40. LPCSTR = CT2CA(myCStr): 烫烫烫烫狊? strlen: 139 sizeof: 4
41. LPCSTR = CT2A(myCStr): 烫烫烫烫髲 strlen: 139 sizeof: 4
42. LPWSTR = CT2W(myCStr): 008FF17C wcslen: 12 sizeof: 4
43. LPCWSTR = CT2CW(myCStr): 00A30888 wcslen: 12 sizeof: 4
44. LPCWSTR = CT2W(myCStr): 008FF064 wcslen: 1106 sizeof: 4
*********Following is wcout:********
45. myStr: How are you? wcslen: 12 sizeof: 4
46. (LPCWSTR)myStr: How are you? wcslen: 12 sizeof: 4
47. LPCWSTR = myStr: How are you? wcslen: 12 sizeof: 4
48. (LPSTR)myStr: H strlen: 1 sizeof: 4
49. (LPCSTR)myStr: H strlen: 1 sizeof: 4
50. CT2CA(myStr): How are you? strlen: 12 sizeof: 132
51. CT2A(myStr): How are you? strlen: 12 sizeof: 132
52. CT2W(myStr): 008FD318 wcslen: 12 sizeof: 260
53. CT2CW(myStr): 0030ADDC wcslen: 12 sizeof: 4
54. (LPSTR)CT2A(myStr): How are you? strlen: 12 sizeof: 4
55. (LPSTR)CT2CA(myStr): How are you? strlen: 12 sizeof: 4
56. (LPCSTR)CT2CA(myStr): How are you? strlen: 12 sizeof: 4
57. (LPCSTR)CT2A(myStr): How are you? strlen: 12 sizeof: 4
58. (LPWSTR)CT2W(myStr): How are you? wcslen: 12 sizeof: 4
59. (LPCWSTR)CT2CW(myStr): How are you? wcslen: 12 sizeof: 4
60. (LPCWSTR)CT2W(myStr): How are you? wcslen: 12 sizeof: 4
61. LPSTR = CT2A(myStr): 烫烫烫烫 strlen: 136 sizeof: 4
62. LPSTR = CT2CA(myStr): 烫烫烫烫€鴱 strlen: 139 sizeof: 4
63. LPCSTR = CT2CA(myStr): 烫烫烫烫赭? strlen: 139 sizeof: 4
64. LPCSTR = CT2A(myStr): 烫烫烫烫h鲝 strlen: 139 sizeof: 4
66. LPCWSTR = CT2CW(myStr): How are you? wcslen: 12 sizeof: 4
68. myCStr: 00A30888 wcslen: 12 sizeof: 4
69. (LPCWSTR)myCStr: How are you? wcslen: 12 sizeof: 4
70. LPCWSTR = myCStr: How are you? wcslen: 12 sizeof: 4
71. CT2A(myCStr): How are you? strlen: 12 sizeof: 132
72. CT2CA(myCStr): How are you? strlen: 12 sizeof: 132
73. CT2W(myCStr): 008FC610 strlen: 12 sizeof: 260
74. CT2CW(myCStr): 00A30888 strlen: 12 sizeof: 4
75. (LPSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
76. (LPSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
77. (LPCSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
78. (LPCSTR)CT2CA(myCStr): How are you? strlen: 12 sizeof: 4
79. (LPWSTR)CT2W(myCStr): How are you? wcslen: 12 sizeof: 4
80. (LPCWSTR)CT2CW(myCStr): How are you? wcslen: 12 sizeof: 4
81. (LPCWSTR)CT2W(myCStr): How are you? wcslen: 12 sizeof: 4
82. LPSTR = CT2A(myCStr): 烫烫烫烫隔? strlen: 139 sizeof: 4
83. LPSTR = CT2CA(myCStr): 烫烫烫烫,魪 strlen: 139 sizeof: 4
84. LPCSTR = CT2CA(myCStr): 烫烫烫烫狊? strlen: 139 sizeof: 4
85. LPCSTR = CT2A(myCStr): 烫烫烫烫髲 strlen: 139 sizeof: 4
87. LPCWSTR = CT2CW(myCStr): How are you? wcslen: 12 sizeof: 4
请按任意键继续. . .
примечание: "请按任意键继续. ." "Нажмите любую клавишу, чтобы продолжить. . ." на китайском языке.
Я сделал следующие предположения и вопросы из результатов:
Предположения:
- Если cout не распознает тип строки в стиле C, он выводит адрес (случай 1), в противном случае он пытается декодировать и выводить строковые символы (случай 6).
- Если тип назначения макросов преобразования строк совпадает с типом источника, он возвращает исходный адрес (случай 9); в противном случае он возвращает адрес вновь выделенной памяти (случай 8).
- Исходя из предположений 1 и 2, искаженные символы в случае 17 можно объяснить следующим образом: поскольку cout распознает LPSTR, он пытается вывести строковые символы, а CT2A возвращает адрес вновь выделенной памяти, которая уже уничтожена с помощью временного объекта CT2A, отсюда и результат,
- Во всех случаях, когда вывод "sizeof" больше 4, он представляет размер типа класса макрокоманды преобразования.
Примечание: все предположения могут быть неверными. Я перечисляю их, чтобы показать мой текущий уровень понимания и надеюсь, что вы, ребята, сможете помочь мне исправить мои заблуждения.
Вопросы:
- В случае 27 28 31 32 33 34, как строка символов ANSI успешно представляет строку широких символов? (это тот же вопрос, что и первоначальный вопрос)
- Для "(LPSTR)myStr" вывод cout равен "H", обрабатывает ли cout первый байт "o", 0x00, как нулевой символ? Почему он не останавливается на первом байте "H"?
- В части wcout, хотя "myStr" или "myCString" преобразуются в строки ANSI, почему wcout все еще может выводить правильную строку? Разве он не распознает только строки широких символов?
- В случаях 52 53 68 73 74, исходя из моего предположения 1, почему wcout не может распознавать строки широких символов, а просто выводит адрес?
Я закомментировал случай 65 67 86 88, потому что каждый раз, когда программа запускает эти строки, она выдает пустой вывод и пропускает остальные строки. Последняя строка вывода, если я раскомментирую четыре случая, будет выглядеть так:
65. LPWSTR = CT2W(myStr): 请按任意键继续. . .
Я на самом деле тестирую с "myStr", назначенной китайской символьной строке
LPCWSTR myStr = _T("你好吗?");//How are you?
Вывод для "你好吗" показывает результаты, аналогичные "Как дела?", За исключением случая 45 46 47 58 59 60 65 66 67 69 70 79 81 86 87 88, показывает поведение, описанное в вопросе 5. Почему тот?
Я знаю, что этот пост может содержать много вопросов, но я думаю, что они все связаны, и, возможно, одна или две основные концепции могут решить все мои вопросы.