2010-01-30 17 views

Trả lời

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

Không trả lời câu hỏi: điều này viết các ký tự hoàn toàn khác nhau: P – Thomas

+1

@Thomas: Nhưng trừ khi bạn hoàn toàn chết não (điều mà tôi hy vọng là không đúng đối với tất cả các lập trình viên). Khả năng thay đổi chương trình trên để in ra các nhân vật khác nhau sẽ là (làm thế nào tôi nên đặt nó) "Một vết cắt chết và dán". Toàn bộ vấn đề là đặt đúng địa phương (vì mặc định là ngôn ngữ "C" thường là không tốt lắm nhưng không phải tiếng Anh). –

+1

Đừng quên sử dụng một phông chữ có chứa các chữ cái của ngôn ngữ mong muốn. Ngoài ra, Farsi như tiếng Ả Rập là RTL, một số chữ cái được kết nối khác không và những gì không. Chúc may mắn cố gắng "sửa" bảng điều khiển giành chiến thắng ngu ngốc để làm những gì bạn muốn;) – AraK

3

Bạn cần chuyển đổi chuỗi thành mã trang thích hợp. MS-DOS codepages được đặt tên như CP437, với CP theo sau là ba chữ số. Lưu ý rằng thông thường chỉ có ít hơn 256 ký tự khác nhau có thể được hiển thị và do đó nhiều ký tự Unicode không thể được hiển thị trong chế độ văn bản.

+0

CP708 là trang mã tiếng Ả Rập trong MS-DOS. Xem http://msdn.microsoft.com/en-us/library/cc195051.aspx để biết danh sách đầy đủ từ Microsoft. – David

0

bạn có thể sử dụng wchar_t thay vì char.

và bạn nên sử dụng wcout thay vì cout quá.

nếu bảng điều khiển của bạn hỗ trợ unicode, thao tác này sẽ hoạt động. một cách khác cho người Iran là một phần mềm được gọi là "vegaf" nhưng nó đã được nhiều năm trước và tôi quên nó.

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