开发者

How to write unicode character farsi in C++ in ms-dos console?

开发者 https://www.devze.com 2022-12-19 03:40 出处:网络
How 开发者_JAVA技巧to write unicode character farsi in c++ in ms-dos? cout<<\"Helo world\"<<\"سلام جهان\";#include <iostream>

How 开发者_JAVA技巧to write unicode character farsi in c++ in ms-dos?

cout<<"Helo world"<<"سلام جهان";


#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
}


You need to convert the string to proper codepage. MS-DOS codepages are named like CP437, with CP followed by three digits. Notice that normally only less than 256 different characters may be displayed and thus many Unicode characters just cannot be shown in text mode.


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();


you can use wchar_t instead of char.

and you should use wcout instead of cout too.

if your console support unicode this will work. another way for Iranians was a software called "vegaf" but its for much years ago and i forget it.

0

精彩评论

暂无评论...
验证码 换一张
取 消