Como escrever o caractere unicode farsi em c ++ no console ms-dos?
Pergunta
Como escrever caracteres unicode farsi em c ++ em ms-dos?
cout << "Helo World" << "سلام جهان";
Solução
#include <iostream>
#include <locale>
#include <string>
int main()
{
using namespace std;
wstring wcs = L"中文";
locale old = wcout.imbue(locale("") ); // "" is environment's default locale
wcout<<wcs<<endl;
wcout.imbue(old ); // restore old locale
}
Outras dicas
Você precisa converter a string para a correção adequada do código. O MS-DOS CodePages é nomeado como CP437, com CP seguido de três dígitos. Observe que normalmente apenas menos de 256 caracteres diferentes podem ser exibidos e, portanto, muitos caracteres Unicode simplesmente não podem ser mostrados no modo de texto.
Você pode usar wchar_t em vez de char.
E você deve usar o WCOUT em vez de Cout também.
Se o seu console suportar unicode, isso funcionará. Outra maneira para os iranianos era um software chamado "VEGAF", mas há muito anos e eu esqueço.
using namespace std;
setlocale(LC_ALL, "fa-IR");
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
struct lconv * lc;
lc = localeconv();
LOGFONT * tFont;
tFont = GetFont();
CFont font;
VERIFY(font.CreateFont(
tFont->lfHeight, // nHeight
tFont->lfWidth, // nWidth
0, // nEscapement
0, // nOrientation
tFont->lfWeight, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ARABIC_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
ANTIALIASED_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
tFont->lfFaceName)); // lpszFacename
const wchar_t yek = L'\u06F1';
const wchar_t dow = L'\u06F2';
const wchar_t seh = L'\u06F3';
const wchar_t chahar = L'\u06F4';
const wchar_t panj = L'\u06F5';
const wchar_t shish = L'\u06F6';
const wchar_t haft = L'\u06F7';
const wchar_t hasht = L'\u06F8';
const wchar_t noh = L'\u06F9';
const wchar_t sefr = L'\u06F0';
wchar_t wFATime[20];
wcscpy(wFATime, L"");
BOOL dayoftheweek = FALSE;
for (unsigned int i = 0; i<m_strText.GetLength(); i++)
{
char c = m_strText[i]; //this is your character
switch (c)
{
case '1':
wcsncat(wFATime, &yek, 1);
break;
case '2':
wcsncat(wFATime, &dow, 1);
break;
case '3':
wcsncat(wFATime, &seh, 1);
break;
case '4':
wcsncat(wFATime, &chahar, 1);
break;
case '5':
wcsncat(wFATime, &panj, 1);
break;
case '6':
wcsncat(wFATime, &shish, 1);
break;
case '7':
wcsncat(wFATime, &haft, 1);
break;
case '8':
wcsncat(wFATime, &hasht, 1);
break;
case '9':
wcsncat(wFATime, &noh, 1);
break;
case '0':
wcsncat(wFATime, &sefr, 1);
break;
case ':':
wcsncat(wFATime, L":", 1);
break;
case '.':
wcsncat(wFATime, L".", 1);
break;
case '/':
wcsncat(wFATime, L"/", 1);
break;
default:
dayoftheweek = TRUE;
}
}
CFont* def_font = pdc->SelectObject(&font);
HDC hdc = pdc->GetSafeHdc();
int old = pdc->SetBkMode(TRANSPARENT);
if (dayoftheweek)
{
CStringW strw(m_strText);
::TextOutW(hdc, m_poOffset.x, m_poOffset.y, strw, strw.GetLength());
}
else
{
::TextOutW(hdc, m_poOffset.x, m_poOffset.y, wFATime, wcslen(wFATime));
}
pdc->SelectObject(def_font);
pdc->SetBkMode(old);
// Done with the font. Delete the font object.
font.DeleteObject();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow