在C中打印unicode字符

时间:2013-02-19 10:12:01

标签: c++ c winapi unicode

我的系统中安装了一些本地语言字体(Windows 8操作系统)。通过Windows中的字符映射工具,我知道了那个特定字体的字符的unicode。 我想通过C程序在命令行中打印这些字符。

例如:假设希腊字母alpha用unicode u + 0074表示。

以“u + 0074”作为输入,我希望我的C程序输出字母

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

使用WriteConsole函数的Unicode版本。

另外,请务必将源代码存储为带有BOM的UTF-8,g ++和visual c ++都支持该


示例,假设您希望以“u + 03B1”形式显示其Unicode代码的希腊字母(您列出的代码代表小写“t”):

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

答案 1 :(得分:1)

有几个问题。如果您在控制台窗口中运行,我会将代码转换为UTF-8,并将窗口的代码页设置为65001.或者,您可以使用wchar_t(在Windows上为UTF-16) ),通过std::wostream输出并将代码页设置为1200.(根据我发现的文档,至少。我没有这方面的经验,因为我的代码必须是可移植的,并且在我曾经使用的其他平台,wchar_t是一些私有的32位编码,或者是UTF-32。)

答案 2 :(得分: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通常用于修改默认的翻译模式   stdinstdout,但您可以在任何文件上使用它。如果你申请   _setmode到流的文件描述符,在对流执行任何输入或输出操作之前调用_setmode。

答案 3 :(得分:0)

在C中有 wchar_t 的基本类型,它定义了一个宽字符。还有相应的功能,如strcat - &gt; wstrcat。当然,这取决于您使用的环境。如果您使用Visual Studio,请查看here