2013-02-19 3 views
0

У меня в моей системе установлен шрифт локального языка (ОС Windows 8). Через инструмент отображения символов в окнах я познакомился с юникодом для этих символов для этого конкретного шрифта. Все, что я хотел напечатать в командной строке с помощью программы C.Печать символа Юникода в C

Например: Предположим, что греческая буква alpha представлена ​​в unicode u + 0074.

Принимая «и + 0074» в качестве входных данных, я хотел бы мой C программу для вывода буквенного символа

Может кто-нибудь мне помочь?

+0

Используйте строки широких символов и выходные функции, такие как [ 'wprintf'] (http://en.cppreference.com/ w/c/io/fwprintf) или ['std :: wcout'] (http://en.cppreference.com/w/cpp/io/cout)? –

+0

@joachim: не поможет (без некоторых дополнительных лесов), потому что они переводится с Unicode на байт-ориентированные. –

+2

u + 0074 - 't'. alpha будет u + 03B1 в Unicode. –

ответ

1

использовать версию Unicode функции WriteConsole.

также, убедитесь, что хранить исходный код в UTF-8 с BOM, который поддерживается г ++ и Visual C++


примера обоих, при условии, что вы хотите представить греческую альфа, учитывая его Unicode код в виде «U + 03B1» (код, который вы перечислены стенды для строчной «т»):

#include <stdlib.h>   // exit, EXIT_FAILURE, wcstol 
#include <string>   // std::wstring 
using namespace std; 

#undef UNICODE 
#define UNICODE 
#include <windows.h> 

bool error(char const s[]) 
{ 
    ::FatalAppExitA(0, s); 
    exit(EXIT_FAILURE); 
} 

namespace stream_handle { 
    HANDLE const output  = ::GetStdHandle(STD_OUTPUT_HANDLE); 
} // namespace stream_handle 

void write(wchar_t const* const s, int const n) 
{ 
    DWORD n_chars_written; 
    ::WriteConsole(
     stream_handle::output, 
     s, 
     n, 
     &n_chars_written, 
     nullptr   // overlapped i/o structure 
     ) 
     || error("WriteConsole failed"); 
} 

int main() 
{ 
    wchar_t const input[] = L"u+03B1"; 
    wchar_t const ch  = wcstol(input + 2, nullptr, 16); 
    wstring const s   = wstring() + ch + L"\r\n"; 

    write(s.c_str(), s.length()); 
} 
+0

Я бы использовал чистый ASCII для исходного кода. –

+0

И если он использует 'WriteConsole', совместимость g ++ не имеет значения. Насколько мне известно, платформа Unix не поддерживает «WriteConsole». Но, конечно, он может выводить непосредственно на 'std :: cout' или' std :: wcout', если он устанавливает соответствующую кодовую страницу в консоли. (В основном я использую кодовую страницу 65001.) –

+0

@James: re «ASCII для исходного кода», который бесполезно ограничен английским алфавитом.несколько лет назад вы обсуждали, как вы и ваши коллеги писали код на неанглийском языке. текущий совет не согласуется с этим. –

0

в C есть примитивный тип wchar_t, который определяет широкий характер. Существуют также соответствующие функции, такие как strcat -> wstrcat. Конечно, это зависит от среды, которую вы используете. Если вы используете Visual Studio, посмотрите here.

+0

Проблема op заключается в том, как отображать символы в консоли Windows, а не представлять их в первую очередь или как конвертировать между строками –

1

Существует несколько вопросов. Если вы работаете в консольном окне, я бы конвертировал код в UTF-8 и установил кодовую страницу для окна на 65001. В качестве альтернативы вы можете использовать wchar_t (это UTF-16 для Windows), вывод через std::wostream и установите кодовую страницу на 1200. (Согласно документации, которую я нашел, по крайней мере. У меня нет опыта в этом, потому что мой код должен быть переносимым, а на других платформах, над которыми я работал, wchar_t был либо отдельным 32-битным кодированием, либо UTF-32.)

+0

-1 предложения не работают. в основном эскизное решение utf-8 нецелесообразно. это связано с тем, что visual C++ хранит узкие строковые константы в качестве ANSI Windows и потому, что такие инструменты, как 'more', не работают с кодовой страницей 65001. Возможно, она работает, если визуальный C++ обманом обрабатывается исходным кодом utf-8 как ansi, но у него есть другие проблемы (конечно). codepage 1200 документируется как доступная только для управляемого приложения и не работает в Windows 7 для вывода через стандартный поток вывода на уровне API. –

+0

@Alf Это работает для меня (по крайней мере, предложение UTF-8). Я использовал его много. –

+0

@ Cheersandhth.-Alf +1. 65001 + UTF-8 - практическое решение, которое заботится о 'more', если текст просто неверен или вообще не существует? Исходный код, вероятно, должен будет кодировать символы, отличные от ASCII, с использованием кодов символов '\ xNN' для создания правильных кодовых точек UTF-8 (или UTF-16, подлежащих дальнейшему преобразованию). Кроме того, они могут быть сгенерированы или загружены откуда-то. –

1

Сначала вы должны установить шрифт TrueType (Consolas) в свойствах консоли. Тогда этот код должен быть достаточным в вашем случае -

#include <stdio.h> 
#include <tchar.h> 

#include <iostream> 
#include <string> 
#include <Windows.h> 
#include <fstream> 

//for _setmode() 
#include <io.h> 
#include <fcntl.h> 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    TCHAR tch[1]; 
    tch[0] = 0x03B1; 

    // Test1 - WriteConsole 
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hStdOut == INVALID_HANDLE_VALUE) return 1; 
    DWORD dwBytesWritten; 
    WriteConsole(hStdOut, tch, (DWORD)_tcslen(tch), &dwBytesWritten, NULL); 
    WriteConsole(hStdOut, L"\n", 1, &dwBytesWritten, NULL); 

    _setmode(_fileno(stdout), _O_U16TEXT); 

    // Test2 - wprintf 
    _tprintf_s(_T("%s\n"),tch); 
    // Test3 - wcout 
    wcout << tch << endl; 

    wprintf(L"\x03B1\n"); 

    if (wcout.bad()) 
    { 
     _tprintf_s(_T("\nError in wcout\n")); 
     return 1; 
    } 
    return 0; 
} 

MSDN -

setmode is typically used to modify the default translation mode of stdin and stdout , but you can use it on any file. If you apply _setmode to the file descriptor for a stream, call _setmode before performing any input or output operations on the stream.

+0

как я помню, не поддерживается g ++ –

+0

@ Cheers и hth. - Альф - Да. Но он упомянул Windows 8. Я добавил несколько альтернатив. – SChepurin

+0

@Shepuring: вы сделали его полупортативным для ** Windows 9x **, но с тарабарщиком на этой платформе. он не компилируется с g ++ 4.7.2, в котором сообщается «foo.cpp: 26: 31: ошибка:« _O_U16TEXT »не была объявлена ​​в этой области». то есть, увы, усилия по переносу были в неправильном направлении. –

Смежные вопросы