一些WinAPI 处理 字符的函数和连接(GetACP和SetThreadLocale最重要,还有SetConsoleCP)
虽然东西都是现成的。但是也要脑子里有个概念。
// 地区与语言
GetACP 取得 ANSI code page,法语XP+设置中文内核 = 936 // ShowMessage(IntToStr(GetACP));
GetThreadLocale 法语XP+设置中文内核 = 2052,纯法语 1036 // ShowMessage(IntToStr(GetThreadLocale));
SetThreadLocale
SetConsoleCP
ConvertDefaultLocale
SetLocaleInfo
GetLocaleInfo
GetLocaleInfoEx
GetCPInfo
MAKELCID
GetSystemDefaultLCID = 2052
GetUserDefaultLCID = 2052
LCIDToLocaleName
GetUserDefaultLocaleName // vista
GetSystemDefaultLocaleName
GetSystemDefaultLocaleName
LCIDToLocaleName
LCMapStringEx
National Language Support Functions
http://msdn.microsoft.com/en-us/library/windows/desktop/dd319081(v=vs.85).aspx
Code Page Identifiers
http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
GetCharABCWidths
GetCharWidth32
--------------------------------------------------------------------------------------------------------
After googling a lot, I saw that lot of people have problems displaying unicode on the console. But I didn't found a solution.
I read that :
1. the console font must be set to lucida TT.
2. the code page must be forced to 1252 (or 65001 for utf-8).
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QTextStream qStdOut(stdout, QIODevice::WriteOnly);
- DWORD dwWritten;
- // 1st try: replace oem with ascii
- #ifdef _WIN32
- std::cout << "Switch input to Ascii CodePage (1252): " << (::SetConsoleCP(::GetACP())?"ok":"fail") << std::endl;
- std::cout << "Switch output to Ascii CodePage (1252): " << (::SetConsoleOutputCP(::GetACP())?"ok":"fail") << std::endl;
- std::cout << "Current input CodePage: " << (unsigned int)::GetConsoleCP() << std::endl;
- std::cout << "Current output CodePage: " << (unsigned int)::GetConsoleOutputCP() << std::endl;
- #endif
- qStdOut.flush();
- qStdOut.setCodec("UTF-16");
- qStdOut.flush();
- std::cout << "cout: " << (char*)unicodeString.utf16() << std::endl;
- std::cout << "cout: " << (char*)(unicodeString.toUtf8().constData()) << std::endl;
- std::wcout << L"wcout: " << (wchar_t*)unicodeString.utf16() << std::endl;
- std::wcout << L"wcout: " << (char*)(unicodeString.toUtf8().constData()) << std::endl;
- printf("printf: %ls\n", unicodeString.utf16());
- wprintf(L"wprintf: %ls\n", unicodeString.utf16());
- #ifdef _WIN32
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"WriteConsoleW: ", 15, &dwWritten, NULL);
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), (unicodeString + '\n').utf16(), unicodeString.length()+1, &dwWritten, NULL);
- #endif
- // 2nd try : set CP to utf-16
- #ifdef _WIN32
- std::cout << "\nSet input CP to ucs2: " << (::SetConsoleCP(1200)?"ok":"fail") << std::endl;
- std::cout << "Set output CP to ucs2: " << (::SetConsoleOutputCP(1200)?"ok":"fail") << std::endl;
- std::cout << "Current input codepage: " << (unsigned int)::GetConsoleCP() << std::endl;
- std::cout << "Current output codepage: " << (unsigned int)::GetConsoleOutputCP() << std::endl;
- #endif
- qStdOut.flush();
- std::cout << "cout: " << (char*)unicodeString.utf16() << std::endl;
- std::wcout << L"wcout: " << (wchar_t*)unicodeString.utf16() << std::endl;
- printf("printf: %ls\n", unicodeString.utf16());
- wprintf(L"wprintf: %ls\n", unicodeString.utf16());
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"WriteConsoleW: ", 15, &dwWritten, NULL);
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), (unicodeString + '\n').utf16(), unicodeString.length()+1, &dwWritten, NULL);
- // 3rd try : set CP to utf-8
- #ifdef _WIN32
- std::cout << "\nSet input CP to utf-8: " << (::SetConsoleCP(65001)?"ok":"fail") << std::endl;
- std::cout << "Set output CP to utf-8: " << (::SetConsoleOutputCP(65001)?"ok":"fail") << std::endl;
- std::cout << "Current input codepage: " << (unsigned int)::GetConsoleCP() << std::endl;
- std::cout << "Current output codepage: " << (unsigned int)::GetConsoleOutputCP() << std::endl;
- #endif
- qStdOut.setCodec("UTF-8");
- qStdOut.flush();
- std::cout << "cout: " << (char*)unicodeString.toUtf8().constData() << std::endl;
- std::wcout << L"wcout: " << (char*)unicodeString.toUtf8().constData() << std::endl;
- printf("printf: %ls\n", unicodeString.toUtf8().constData());
- wprintf(L"wprintf: %ls\n", unicodeString.toUtf8().constData());
- #ifdef _WIN32
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"WriteConsoleW: ", 15, &dwWritten, NULL);
- WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), (unicodeString + '\n').utf16(), unicodeString.length()+1, &dwWritten, NULL);
- #endif
- return a.exec();
- }
The resulting output is awfull...
- Switch input to Ascii CodePage (1252): ok
- Switch output to Ascii CodePage (1252): ok
- Current input CodePage: 1252
- Current output CodePage: 1252
- QTextStream: ?
- Q T e x t S t r e a m : ˆ—
- cout: ˆ—
- cout: 鞈
- wcout: printf:
- wprintf: WriteConsoleW: 鞈
- Set input CP to ucs2: fail
- Set output CP to ucs2: fail
- Current input codepage: 1252
- Current output codepage: 1252
- Q T e x t S t r e a m : ˆ—
- cout: ˆ—
- printf:
- wprintf: WriteConsoleW: 鞈
- Set input CP to utf-8: ok
- Set output CP to utf-8: ok
- Current input codepage: 65001
- Current output codepage: 65001
- QTextStream: 鞈
- cout: printf:
- wprintf: WriteConsoleW: 鞈
http://www.qtcentre.org/threads/2344-Unicode-on-(Win32)-console
一些WinAPI 处理 字符的函数和连接(GetACP和SetThreadLocale最重要,还有SetConsoleCP)的更多相关文章
- 字符数组函数,连接strcat 复制函数strcpy 比较函数strcmp 长度函数 strlen
之前我们学习数据类型的时候,有一个类型 char ,这个类型允许我们在里边放一个字符 char variable1='o'; char variable2='k'; #include <iost ...
- DB2字符处理函数
转自:http://www.blogjava.net/bingle/archive/2007/07/11/129681.html ----------------------------------- ...
- 数据库Oracle字符处理函数
练习字符处理函数(数据库表都是从1开始),我们用到一张"伪表" dual: dual 表:dual 是一张只有一个字段,一行记录的表.dual 表也称之为'伪表',因为他不存储主题 ...
- dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)
dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...
- ctype.h库函数----字符操作函数
在c++中使用时: #include <cctype> 字符判断函数 1.isalnum函数--判断是否是英文字母或数字字符,如果是,则返回非0值,如果不是,则返回0. 函数参数 :可以 ...
- strtr和str_replace字符替换函数
(一)strtr是字符替换函数 (1)单个字符替换: <?php echo strtr("abba", "ab", "10"),&qu ...
- 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
- MySQL中concat函数(连接字符串)
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- C语言字符串匹配函数
C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
随机推荐
- VS2015开发常用快捷键
以下内容均Ctrl+后面的按钮 M-O\P折叠 K-F 格式化 K-U\C注释 K-S侧外代码-(区域代码) 代码片段 ctor 自动生成默认的构造函数 prop 自动生成get set方法 cw 自 ...
- windows 10安装python3和python2
安装包下载: 安装包下载请点我 下载完安装包就可以开始安装了,下面是流程图! Python3.6安装流程: 选择自定义安装: 直接next 为电脑上的所有用户安装 然后install就ok了! 安装完 ...
- 命令——tree
tree——以树形结构显示目录文件 [root@centos71 ~]# yum provides tree Loaded plugins: fastestmirror Loading mirror ...
- iOS---如何获取手机的本地照片和相册
__weak ViewController *weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIO ...
- html的a链接的href怎样才另起一个页面,一个页面调到另一个html页面
在后面加上target ="_blank",就可以,正如: <ul class="nav navbar-nav navbar-right" style=& ...
- java上传大文件(局域网环境)
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )
题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...
- 【CF1247E】Rock Is Push(DP,二分)
题意:有一个n*m的方格,每一格可能为空也可能有石头,要从(1,1)走到(n,m),每次可以往右或往下走 每次走的时候都会将自己面前的所有石头向移动方向推一格,如果碰到了边界就推不过去 问方案数模1e ...
- PHP快速教程
1.本文主要针对有C语言(或其他编程语言)基础的人快速学习PHP的,所以不会对一些基础知识作过多解释,比如“=”是赋值不是等于. 2.本文适合已学过一门编程语言,想要快速入门PHP的人. 3.基本上看 ...
- [CSP-S模拟测试]:位运算(数学)
题目传送门(内部题72) 输入格式 输入文件$bit.in$ 每个输入文件包含$T$组测试数据.输入文件的第一行为一个整数$T$,表示数据组数.接下来$T$行,每行表示一组测试数据每组测试数据包括三个 ...