1

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

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

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

谁能帮我?

4

4 回答 4

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() );
}
于 2013-02-19T10:14:19.127 回答
1

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

于 2013-02-19T10:19:57.170 回答
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通常用于修改 and 的默认翻译模式 stdinstdout但您可以在任何文件上使用它。如果应用 _setmode到流的文件描述符,请在对流执行任何输入或输出操作之前调用 _setmode。

于 2013-02-19T11:16:15.003 回答
0

在 C 语言中有wchar_t的原始类型,它定义了一个宽字符。还有相应的函数,如 strcat -> wstrcat。当然,这取决于您使用的环境。如果您使用 Visual Studio,请查看此处

于 2013-02-19T10:15:42.243 回答