Я хочу отобразить арабское сообщение, смешанное с китайским, используя wcout.
Следующий код в порядке:
#include <iostream>
using namespace std;
int main()
{
wcout.imbue(locale("chs"));
wcout << L"中文"; // OK
}
Однако следующий код не работает:
#include <iostream>
using namespace std;
int main()
{
wcout.imbue(locale(/* What to place here ??? */));
wcout << L"أَبْجَدِيَّة عَرَبِيَّة中文"; // Output nothing. VC++ 2012 on Win7 x64
// Why does the main advantage of unicode not apply here?
}
Я думаю, что концепция кодовых страниц должна быть устаревшей после принятия юникода.
Q1. Каков механизм отображения такого текста?
Q2. Почему Windows, как ОС на основе Unicode, не поддерживает вывод символов Unicode в своем окне консоли?
CRT будет обрабатывать весь вывод в файлы как ANSI по умолчанию. Вы можете изменить это с помощью этой строки в начале вашей программы
_setmode(_fileno(stdout), _O_WTEXT);
Хорошая ссылка @ http://www.siao2.com/2008/03/18/8306597.aspx
Просто для справки двунаправленная языковая поддержка ограничена в большинстве командных строк, и, насколько я понимаю, это ограничение, вызывающее эту проблему здесь. Почему это не поддерживается, я не могу ответить.
Я только что прочитал эту статью
«К резюме …
Если вы используете Visual C ++, вы не можете использовать UTF-8 для печати текста в std :: cout.
Если вы все еще хотите, пожалуйста, прочитайте эту удивительно длинную статью о том, как заставить работать wcout и cout, но на самом деле это не дает простого решения — в конце концов, мы переходим к переопределению потоковых буферов … »http://alfps.wordpress.com/2011/12/08/unicode-part-2-utf-8-stream-mode/
(из этого блога http://blog.cppcms.com/post/105)
Вы можете попробовать это:
Я предполагаю, что вы смогли отрисовать только китайский текст. Это означает, что у вас есть файлы китайских шрифтов.
Пожалуйста, попробуйте текст только на арабском языке. Если вы можете выполнить рендеринг, это означает, что в вашей системе есть арабский шрифт.
Но когда вы смешиваете это, арабский + китайский, вам нужно принудительно выбрать файл шрифта, который имеет оба набора глифов. Я думаю, что файл шрифтов по умолчанию, подобранный wcout, не имеет арабских символов.
Я предполагаю, что вы можете получить коробки для арабских юникодов.
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U16TEXT); // or _O_WTEXT
std::wcout << L"أَبْجَدِيَّة عَرَبِيَّة中文" << std::endl;
}