我的系统中安装了一些本地语言字体(Windows 8操作系统)。通过Windows中的字符映射工具,我知道了那个特定字体的字符的unicode。 我想通过C程序在命令行中打印这些字符。
例如:假设希腊字母alpha用unicode u + 0074表示。
以“u + 0074”作为输入,我希望我的C程序输出字母
任何人都可以帮助我吗?
答案 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
通常用于修改默认的翻译模式stdin
和stdout
,但您可以在任何文件上使用它。如果你申请_setmode
到流的文件描述符,在对流执行任何输入或输出操作之前调用_setmode。
答案 3 :(得分:0)
在C中有 wchar_t 的基本类型,它定义了一个宽字符。还有相应的功能,如strcat - &gt; wstrcat。当然,这取决于您使用的环境。如果您使用Visual Studio,请查看here。