2010-01-30 6 views

Respuesta

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

No responde la pregunta: esto escribe caracteres completamente diferentes: P – Thomas

+1

@Thomas: Pero a menos que esté completamente con muerte cerebral (que espero que no sea cierto para todos los programadores). La capacidad de cambiar el programa anterior para imprimir diferentes caracteres será (cómo debería decirlo) "Una trenza cortada y pegada". El objetivo es establecer el local correcto (ya que el valor predeterminado es la configuración regional "C" que, por lo general, no es muy buena en nada que no sea el inglés). –

+1

No olvide utilizar una fuente que contenga las letras del idioma deseado. Además, Farsi like Arabic es RTL, algunas letras están conectadas, otras no y lo que no. Buena suerte tratando de "arreglar" la estúpida consola win para hacer lo que quieras;) – AraK

3

Necesita convertir la cadena a la página de códigos adecuada. Las páginas de códigos de MS-DOS se nombran como CP437, con CP seguido de tres dígitos. Tenga en cuenta que normalmente solo se pueden mostrar menos de 256 caracteres diferentes y, por lo tanto, muchos caracteres Unicode simplemente no se pueden mostrar en modo texto.

+0

CP708 es la página de código árabe en MS-DOS. Consulte http://msdn.microsoft.com/en-us/library/cc195051.aspx para obtener la lista completa de Microsoft. – David

0

puede usar wchar_t en lugar de char.

y debe usar wcout en lugar de cout también.

si su consola admite unicode esto funcionará. Otra forma para los iraníes fue un software llamado "vegaf", pero fue hace muchos años y lo olvido.

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