嗨,我试图将unicode字符串输出到带有iostreams的控制台并失败.
我发现了这一点: 在c ++控制台应用程序中使用unicode字体 ,这个代码片段有效.
SetConsoleOutputCP(CP_UTF8);
wchar_t s[] = L"èéøÞ????æ?a";
int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
char* m = new char[bufferSize];
WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL);
wprintf(L"%S", m);
Run Code Online (Sandbox Code Playgroud)
但是,我没有找到任何方法来使用iostream正确输出unicode.有什么建议?
这不起作用:
SetConsoleOutputCP(CP_UTF8);
utf8_locale = locale(old_locale,new boost::program_options::detail::utf8_codecvt_facet());
wcout.imbue(utf8_locale);
wcout << L"¡Hola!" << endl;
Run Code Online (Sandbox Code Playgroud)
编辑 我找不到任何其他解决方案,而不是在流中包装此片段.希望,有人有更好的想法.
//Unicode output for a Windows console
ostream &operator-(ostream &stream, const wchar_t *s)
{
int bufSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
char *buf = …Run Code Online (Sandbox Code Playgroud) 所以我终于回到了我的主要任务 - 将一个相当大的C++项目从Windows移植到Mac.
直接我遇到了wchar_t在Windows上为16位但在Mac上为32位的问题.这是一个问题,因为所有字符串都由wchar_t表示,并且在Windows和Mac机器之间会有来回的字符串数据(在磁盘数据和网络数据形式中).由于它的工作方式,在发送和接收数据之前将字符串转换为某种通用格式并不是完全简单的.
我们最近也开始支持更多语言,因此我们开始处理大量的Unicode数据(以及处理从右到左的语言).
现在,我可能会在这里混淆多个想法并为自己造成比需要更多的问题,这就是为什么我在问这个问题.我们认为将所有内存中的字符串数据存储为UTF-8非常有意义.它解决了wchar_t是不同大小的问题,这意味着我们可以轻松支持多种语言,它还可以大大减少我们的内存占用(我们有很多 - 主要是英文 - 字符串加载) - 但似乎很多人都没有这个.有什么我们想念的吗?有一个明显的问题,你必须处理字符串长度可以小于存储该字符串数据的内存大小.
或者使用UTF-16更好的主意?或者我们应该坚持使用wchar_t并编写代码来在我们读/写磁盘或网络的地方转换wchar_t和Unicode之间的转换?
我知道这是危险地接近要求的意见 - 但我们很紧张,因为我们忽视的东西明显,因为它似乎并不像有许多Unicode字符串类(例如) - 但尚未有足够的代码转换为/来自Unicode,如boost :: locale,iconv,utf-cpp和ICU.
我有上一个问题中的可爱函数,如果我这样做可以正常工作:
wstring temp;
wcin >> temp;
string whatever( toUTF8(getSomeWString()) );
// store whatever, copy, but do not use it as UTF8 (see below)
wcout << toUTF16(whatever) << endl;
Run Code Online (Sandbox Code Playgroud)
原始形式被复制,但在形式之间通常包含额外的字符.如果我输入例如àçé输入,并添加一个cout << whatever语句,我将得到?à?ç?é输出.
我是否仍然可以使用此字符串与其他人进行比较,从ASCII源获取?或者不同地问:如果我?à?ç?é通过linux中的UTF8 cout 输出,它会读取àçé吗?是字符串的字节内容,àçé由cin读取UTF8 linux,与Win32 API获取的内容完全相同?
谢谢!
PS:我问的原因是因为我需要使用很多字符串来比较其他读取值(比较和连接......).
我需要从char*转换为wchar.这就是我的表现.
char * retrunValue= getData();
size_t origsize = strlen(returnValue) + 1;
const size_t newsize = 200;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, returnValue, _TRUNCATE);
wcscat_s(wcstring, L" (wchar_t *)");
Run Code Online (Sandbox Code Playgroud)
当我试图打印转换后的值"wcstring"时,getData()函数返回一个char*值,例如"C:/ Documents and Settings":值不正确:它是这样的"C:/ Documen9"之类的东西垃圾.1-请告诉我以这种方式从char*转换为wchar是安全的,正如我正在做的那样2-如何获取getData()函数返回的原始值
感谢和问候
更新:
size_t origsize = strlen(returnValue) + 1;
const size_t newsize = 200;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
wsprintf(wcstring, newsize, L"%S (wchar_t *)", returnValue);
Run Code Online (Sandbox Code Playgroud)
添加了这个,但它说."size_t类型的参数与"LPCWSTR"类型的参数不兼容"