我的系统中安装了一些本地语言字体(Windows 8 操作系统)。通过 Windows 中的字符映射工具,我了解了该特定字体的那些字符的 unicode。我只想通过 C 程序在命令行中打印这些字符。
例如:假设希腊字母 alpha 用 unicode u+0074 表示。
以“u+0074”作为输入,我希望我的 C 程序输出字母字符
谁能帮我?
使用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() );
}
有几个问题。如果您在控制台窗口中运行,我会将代码转换为 UTF-8,并将窗口的代码页设置为 65001。或者,您可以使用wchar_t
(在 Windows 上为 UTF-16),通过输出std::wostream
和将代码页设置为 1200。(根据我找到的文档,至少。我没有这方面的经验,因为我的代码必须是可移植的,并且在我工作过的其他平台上,wchar_t
已经一些私有的 32 位编码,或 UTF-32。)
首先,您应该在控制台的属性中设置 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 的默认翻译模式stdin
,stdout
但您可以在任何文件上使用它。如果应用_setmode
到流的文件描述符,请在对流执行任何输入或输出操作之前调用 _setmode。
在 C 语言中有wchar_t的原始类型,它定义了一个宽字符。还有相应的函数,如 strcat -> wstrcat。当然,这取决于您使用的环境。如果您使用 Visual Studio,请查看此处。