Làm thế nào để viết ký tự unicode farsi trong C++ trong ms-dos?Làm thế nào để viết farsi ký tự unicode trong C++ trong giao diện điều khiển ms-dos?
cout < < "Thế giới trợ giúp" < < "سلام جهان";
Làm thế nào để viết ký tự unicode farsi trong C++ trong ms-dos?Làm thế nào để viết farsi ký tự unicode trong C++ trong giao diện điều khiển ms-dos?
cout < < "Thế giới trợ giúp" < < "سلام جهان";
#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
}
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
@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). –
Đừ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
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.
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
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ó.
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();
Bạn có nghĩa là 'cách' thay vì 'người'? –
Bạn có thực sự có ý nghĩa trong MS-Dos, hoặc bạn có nghĩa là dấu nhắc lệnh trong một phiên bản hiện đại của Windows? –