C++ Builder控制台应用中如何正确打印String类型内容?
C++ Builder控制台打印String类型乱码的解决方法
C++ Builder中的String默认是UnicodeString(UTF-16编码的宽字符类型),而std::cout仅支持输出ANSI窄字符(char*),直接用t_str()或c_str()返回的wchar_t*宽字符指针给std::cout输出时,会被错误解析为窄字符,导致乱码。
以下是几种可行的解决方式:
方法1:使用std::wcout输出宽字符
std::wcout专门用于处理宽字符输出,直接搭配String的c_str()或t_str()即可:
bool Tests::test001() { std::string temp; CDecoder decoder; String input = "60000000190210703800000EC00000164593560001791662000000000000080000000002104302040235313531353135313531353153414C4535313030313233343536373831323334353637383930313233"; String expected_output = "6000000019"; String output = decoder.getTPDU(input); std::wcout << L"Expected :" << expected_output.c_str() << std::endl; std::wcout << L"Obtained :" << output.c_str() << std::endl; return output == expected_output; }
方法2:转换为ANSI字符串输出
如果你的字符串内容仅包含ASCII字符,可以将String转换为AnsiString后再输出:
bool Tests::test001() { std::string temp; CDecoder decoder; String input = "60000000190210703800000EC00000164593560001791662000000000000080000000002104302040235313531353135313531353153414C4535313030313233343536373831323334353637383930313233"; String expected_output = "6000000019"; String output = decoder.getTPDU(input); std::cout << "Expected :" << AnsiString(expected_output).c_str() << std::endl; std::cout << "Obtained :" << AnsiString(output).c_str() << std::endl; return output == expected_output; }
方法3:配置控制台为UTF-8编码输出
如果需要支持非ASCII字符,可先设置控制台输出编码为UTF-8,再将String转换为UTF-8格式输出:
#include <windows.h> bool Tests::test001() { // 设置控制台输出编码为UTF-8 SetConsoleOutputCP(CP_UTF8); std::string temp; CDecoder decoder; String input = "60000000190210703800000EC00000164593560001791662000000000000080000000002104302040235313531353135313531353153414C4535313030313233343536373831323334353637383930313233"; String expected_output = "6000000019"; String output = decoder.getTPDU(input); std::string expected_utf8 = UTF8String(expected_output); std::string output_utf8 = UTF8String(output); std::cout << "Expected :" << expected_utf8.c_str() << std::endl; std::cout << "Obtained :" << output_utf8.c_str() << std::endl; return output == expected_output; }
内容的提问来源于stack exchange,提问作者Beto
相关产品推荐
相关产品推荐

