2010-01-30 27 views

Odpowiedz

3
#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 
} 
+0

Nie odpowiada na pytanie: to pisze zupełnie inne postacie: P – Thomas

+1

@Thomas: Ale jeśli nie jesteś całkowicie martwy mózg (co, mam nadzieję, nie jest prawdziwe dla wszystkich programistów). Możliwość zmiany powyższego programu w celu wydrukowania różnych znaków będzie (jak powinienem to powiedzieć) "Warkocz martwego cięcia i wklejania". Chodzi o to, aby ustawić poprawne lokalne (ponieważ domyślnie jest to ustawienie "C", które zwykle nie jest bardzo dobre w niczym innym niż angielskim). –

+1

Nie zapomnij użyć czcionki zawierającej litery pożądanego języka. Również język farsi, taki jak arabski, to RTL, niektóre litery są połączone, inne nie są, a co nie. Powodzenia w "naprawianiu" głupiej wygrywającej konsoli, aby robić to, co chcesz;) – AraK

3

Konwertuj ciąg znaków na prawidłową stronę kodową. Strony kodowe MS-DOS są nazywane CP437, z CP i trzema cyframi. Zauważ, że zwykle może być wyświetlanych tylko mniej niż 256 różnych znaków, a zatem wiele znaków Unicode po prostu nie może być wyświetlanych w trybie tekstowym.

+0

CP708 to arabska strona kodowa w MS-DOS. Zobacz http://msdn.microsoft.com/en-us/library/cc195051.aspx, aby uzyskać pełną listę od Microsoft. – David

0

Możesz użyć wchar_t zamiast char.

i powinieneś używać także wcout zamiast cout.

jeśli twoja konsola obsługuje Unicode, to zadziała. innym sposobem dla Irańczyków było oprogramowanie o nazwie "vegaf", ale było to wiele lat temu i zapomniałem o nim.

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