UNICODE API的重要一步

嵌入式 Linux下利用FreeType2的API实现字符的显示 能显示汉字的比较难找,C语言代码写的更难找,能找到的,基本上是被转载了N遍的同一个示例代码,基本上解决不了我的问题。   于是乎,花费了不少时间才完成了这些代码;   主要功能是:   将传入的GB2312编码的char型字符串转换成图片数组并输出。   主要原理是:   将GB2312编码的char型字符串,转换成unicode编码的wchar_t型字符串;   之后,利用FreeType2的 阅读详情
 
一、Unicode简介
1、Unicode扩展自ASCII字符集。在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每有8位宽;而Unicode使用全16位字符集。其实也就是一个宽字符集。
2、在char中一个变量只能保存一个ASCII字符,但是一个char指针可以保存多个,和数据char一样,最后一个字符是用来保存/0的。
3、C中的宽字符基于wchar_t数据型态,它在几个表头文件包括了WCHAR.H
       Typedef unsigned short wchar_t;这是一个16位宽字符,也是Unicode。
Wchar_t *p=L”Hello!”紧接在第一个引号前面的大写字母L(long)这将告诉编译器该字符串按宽字符保存即占用2个字节。
       4、得到宽字符的长度:
           ASCII的字符串长度:
char *pc=”Hello!”;iLength=strlen(pc);这里的iLength等于6也就是字符数。
UniCode字符串长度:
Wchar_t *pw=L”Hello!”;iLength=strlen(pw);iLenght等于1这是因为”hello!”的字符占用16位:0x0048(H) 0x0065(e)……处理器在内存中存为:48 00 65 00…..strlen是读到00表示结束所有只有一位!
在这里我们就要用到计算宽字符的strlen即wcslen(wide-character string length)并且在STRING.H和WCHAR.H中均有说明。Strlen函数说明如下:
Size_t__cdecl strlen(const char*);
Size_t__cdecl wcslen(const wchar_t*);这样我们就可以用iLenght=wcslen(pw)来计算其长度了结果为6改成宽字节后,字符串的字符长度不改变,只是位数长度改变了。
所有带有字符串参数的C执行链接库函数都有宽字符版。Printf的宽字符版是wprintf,这些函数在WCHAR.H和含有标准函数说明的表头文件中说明。
二、单一原始码:(tchar.h)
宽字符执行时期链接库中的函数比常规的函数大,所以要用两个版本的程序来处理ASCII和Unicode字符串,即能处理ASCII又能处理Unicode的代码就是单一原始码文件。
1、 用TCHAR.H表头文件。不是ANST C标准的部分所以定义的每个函数和宏定义的前面都有一个底线。TCHAR.H为需要字符串参数的标准执行链接库函数提供了一系列的替代名称。
2、 在这里我们用的单一原始码是_tcslen这个函数是在ASCII和Unicode中自己识别是否是用strlen还是用wcslen在什么情况下_tcslen是strlen什么时候是wcslen?
Strlen(ASCII字符长度),wcstrlen(UNICODE字符长度),_tcslen(多型态字符长度),tchar(多型态字符类型),wchar_t(字符类型),char(字符类型)的不定时态:
如果定义了名为_UNICODE的标识符,并且程序中包含了TCHAR.H表头文件,那么_tcslen就定义为wcslen:#define _tcslen strlen
如果没有定义UNICODE,则_tcslen定义为strlen:#define _tcslen wcslen
TCHAR.H还用一个新的数据型态TCHAR来解决两种字符数据型态的问题。如果定义了_UNICODE标识符,那么TCHAR就是wchar_t:
Typedef wchar_t TCHAR;
否则,TCHAR就是char
Typedef char TCHAR;
 
3、 字符串前的L处理:
如果定义了_UNICODE标识符,那么一个称作_T的宏就定义如下:
#define _T(X) L##x       //这是合乎ANSI C标准的前置处理器规范
如:_T(“hello”)--àL”hello”
如果没有定义了_UNICODE那么_T就定义成如下:
#define _T(X) x
此外还有两个和_T想同的宏定义:
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
4、 Windows表文件类型:
WINNT.H定义了新的数据形态,称作CHART和WCHAR
typedef char CHAR;
Typedef wchar_t WCHAR;//wc
当您需要定义8位或者16位字符时,推荐您用CHAR和WCHAR,用到了WCHAR的变量时前面要加入wc匈牙利标记法。
       5、8位CHAR字符串指针和const 8位字符串指针的数据形态
              typedef CHAR *PCHAR,*LPCH,*PCH,*NPSTR,*LPSTR,*PSTR;
              typedef CONST CHAR *LPCCH,*PCCH,*LPCSTR,*PCSTR;
       6、16位WCHAR字符串指针和const WCHAR 字符串指针
              typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR;
              typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR
              以上的几种数据类型都是为了兼容以前16位系统的near和long指针而用的。
       7、#ifdef UNICODE
              Typedef WCHAR TCHAR,*PTCHAR;
              Typedef LPWSTR LPTCH,PTCH,PTSTR,LPTSTR;
              Typedef LPCWSTR LPCTSTR;
          #else
              Typedef char TCHAR,*PTCHAR;
              Typedef LPSTR LPTCH,PTCH,PTSTR,LPTSTR;
              Typedef LPCSTR LPCTSTR;
              #endif
8、如果你希望明确定义8位字符变量和字符串,可以使用CHAR,PCHAR以及带引号的字符串。为明确地使用16位字符变量和字符串,可以使用WCHAR,PWCHAR并将L添加到引号前面。对于8位还是16位取决于UNICODE标识符的定义的变量或字符串,可以使用TCHAR,PTCHAR和TEXT宏。
三、Windows函数调用:
       1、MessageBox的用法:
               WINUSERAP int WINAPI MessageBoxA(HWND hWnd,
LPCSTR lpText,LPCSTR lpCaptiopn,             //两个是8位的字符串
UINT uType);
                 WINUSERAPI int WINAPI MessageBoxW (HWND hWnd,
                LPCWSTR lpText, LPCWSTR lpCaption,//两个是16位字符串
                UINT uType);
               
               MessageBox的多形态:
               #ifdef UNICODE
               #define MessageBox MessageBoxW
               #else
               #define MessageBox MessageBoxA
               #endif
这样,如果定义了UNICODE标识符,那么程序中所有的MessageBox函数呼叫实际上就是MessageBoxW函数;否则就是MessageBoxA函数。
       2、在windows定义的一组字符串函数,这些函数用来计算字符串长度,复制字符串,    连接字符串和比较字符串:
              iLength=lstrlen(pString);
              pString=lstrcpy(pString1,pString2);
              pString=lstrcpyn(pString1,pString,iCount);
              pString = lstrcat (pString1, pString2) ;
iComp = lstrcmp (pString1, pString2) ;
iComp = lstrcmpi (pString1, pString2) ;
这些函数与C链接库中对应的函数功能相同。如果定义了UNICODED标识符,那么这些函数将接受宽字符串,否则只接受常规字符串。宽字符串版的lstrlenW函数可在windows98中用!
       3、printf在windows中的应用
             
 
ASCII
宽字符
常规
参数的变数个数
 
 
 
标准版
sprintf
swprintf
_stprintf
最大长度版
_snprintf
_snwprintf
_sntprintf
Windows版
wsprintfA
wsprintfW
wsprintf
参数数组的指针
 
 
 
标准版
vsprintf
vswprintf
_vstprintf
最大长度版
_vsnprintf
_vsnwprintf
_vsntprintf
Windows版
wvsprintfA
wvsprintfW
wvsprintf
      
Unicode化1 <br />Unicode化 <br /> <br />作者:斑鸠<br />更新时间:2009/08/21<br />为了程序编写方便,根除乱码问题等等需求,很多新项目都采用了Unicode编码。<br />同时,不少使用MBCS多字节编码的旧项目为了升级,也有了转向Unicode编码的意向。<br />不过,从MBCS升级到Unicode并不是无缝的,该问题的复杂程度,取决于代码总量和<br />代码的编写质量。<br /><br />本文是作者在一个C/C++项目中的一些经验之谈,希望对有此需求的读 阅读详情

相关推荐

ArcGIS API for JavaScript中的Arial Unicode MS字体定制

在本章中,我们将探讨Esri ArcGIS API for JavaScript,它是一个用于构建和部署动态地图、地理分析和数据可视化应用程序的库。我们首先将从高层次理解API的架构和功能,然后深入了解它的核心特性,如地图渲染、图层管理、空间分析和交互式工具。为了更好地理解API的使用,我们将通过简单的代码示例来介绍如何初始化地图、添加图层以及集成额外的地图功能。// 初始化一个基本的地图视图basemap: "streets", // 设置基础地图为街道地图});// 创建一个视图以展示地图。

weixin_36364707的博客 906

在windows 中的转变:wcslen

(1)对于宽字符需要用wcslen来测长度,而不能用strlen来测。 strlen函数的宽字符版是wcslen(wide-character string length:宽字符串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:size_t __cdecl strlen (const char *) ;

Athenaer的专栏 1717

2023-11-20 MySQL ARM64 银河麒麟

背景 MySQL是常用数据库,Windows安装比较容易,笔者也有记录。现在国产化系统银河麒麟中安装,不同的是软件安装包不容易下载。一是安装的方式,再一个是MySQL本身的版本,网上很多文档说明其实都是对的,但是为什么那么多都不一样呢?就是MySQL本身的版本差异比较大,这些差异笔者也不是很清楚,但是不要用8和5.7的差异非常大,8即使安装的很顺利,在使用过程也会很多坑,导致我宁愿卸载8,也要重新...

jxmh1991@163.com 811

sizeof和strlen

sizeof():求字节byte个数 strlen():转求字符串或字符数组的字符元素个数,因为字符占一个字节,故也相当于求字符串或字符数组的的字节byte个数

ChengChengCheng的博客 136

SDR实战(四)-AD9361使用手册(三)

本节定义了并行数据端口和串行外设接口(SPI),它们使得AD9361与基带处理器(BBP)之间能够传输数据和控制/状态信息。图63展示了这些接口,并提供了AD9361和BBP在宽带无线系统中使用方式的高级概述。数据接口以两种模式之一运行:兼容标准CMOS模式或兼容低压差分信号(LVDS)模式。每个接口都具有以下部分描述的独特特性。使用CMOS模式时:保持了单端-CMOS逻辑兼容性。可以使用一个或两个数据端口。使用两个端口可以提高数据吞吐量。

hutx0924的博客 6246

Windows server Database 2025 安装 i225/i226 网卡驱动

Windows server Database 2025 安装 i225/i226 网卡驱动 windows这比坏得很,intel消费级网卡不准在服务器系统上安装。你要说他是异构不支持?他就纯粹恶心人。 之前已经安装过一次,但是今天database预览版一更新,又给我把网卡驱动杀了,气死,写一篇教程。 到这里就完成了,总之还是想辱骂windows,提供便捷的同时又人为制造困难,多少有点(隔壁linux内核直接自带全家桶了就一省心) 并且近年Intel的新U安装显卡驱动和普通声卡驱动都不会出声

低温热源的博客 1万+

带你玩转Visual Studio——带你理解多字节编码与Unicode码

上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的一个地方,我们对它进行了总结和归纳。本篇文章我们将继续讲解C++开发中容易混淆的另一个概念——多字节字符集与Unicode字符集。多字节字符与宽字节字符char与wchar_t我们知道C++基本数据类型

阳光日志 4万+

库卡机器人外部轴配置全流程:从接线到WorkVisual 6.0实战(附避坑指南)

本文详细解析了库卡机器人外部轴配置的全流程,涵盖从硬件接线到WorkVisual 6.0软件配置的实战步骤。重点介绍了KPP驱动模块连接、电机参数匹配、安全配置激活及零点标定等关键环节,并提供了实用的避坑指南,旨在帮助工程师高效、安全地完成外部轴集成,提升工作站柔性。

weixin_29161785的博客 497

C语言宽字符概念及处理 api

宽字符概念宽字符概念宽字符又称多字节字符又称Unicode,在我们在日常写代码的过程中,大部分接触的是ASCII 字符,那么对于字符变量,我们常用的数据类型是char,但是对于中文字符,用char变量就不行了,那么就需要使用宽字符了。也就是说一般的字符是一个字节组成的,如 0x0a,0x38,那么对于普通字符,0x00就可以用来表示字符串结束符,而宽字符通常是由两个字节组成的,例如:0x0061(97)依然是用来表示字符 a,不过它是由两个字节组成,这样一个宽字符最多可表示。

jiu_yue_ya的博客 2612

电动汽车欧标直流充电标准解析

电动汽车和电动汽车充电市场是动态发展的,欧洲也正在努力部署基础设施,以支持欧洲快速增长和多样化的电动汽车充电需求。

网络安全的研究者、新能源行业的追求者 7620

通俗讲解清楚光线追踪中的蒙特卡洛积分

彻底讲解光线追踪中的蒙特卡洛积分

qq_37366618的博客 1243

宽字符介绍

转自:http://blog.youkuaiyun.com/hairetz/article/details/4198191 一.宽字符介绍 首先说,什么是ASCII,ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH)。 其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符

刘松华-林散 6210

【信息科学与工程学】【物理/化学科学和工程技术】第八篇 光学07

对于光源-探测器距离 ρ, 稳态漫反射率 R(ρ) ≈ (1/(4π)) [ z₀ (μ_eff + 1/r₁) exp(-μ_eff r₁)/r₁² + (z₀ + 2z_b) (μ_eff + 1/r₂) exp(-μ_eff r₂)/r₂² ], 其中 μ_eff = √(3μ_a(μ_a+μ_s’)), z₀=1/μ_s’, z_b 与边界条件有关。通过测量光纤各点的布里渊频移 ν_B(z) 来得到应变/温度分布:Δν_B(z) = C_ν,ε Δε(z) + C_ν,T ΔT(z)。

weixin_49199313的博客 330

UTF-8 转 Unicode, Unicode 转 GBK, UTF-8 转 GBK

UTF-8   转   Unicode,   Unicode   转   GBK,   UTF-8   转   GBK #include   #include   void   main()   { //三个不同版本的老徐 unsigned   char   utf8[]   =   "/xe8/x80/x81/xe5/xbe/x90 "; unsigned   char   unicode[

chenshuixian2的专栏 1460

Jetson agx Orin 适配Xenomai4

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

xiaoning132的专栏 467

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python3 unicode_关于python 3.x:Python3表情符号作为unicode

我在python3中有一个字符串,其中包含emojis,我想将emojis视为其unicode表示。 我需要以这种格式对表情符号进行一些操作。1s = '?? ?? hello'这会将每个表情符号视为自己的字符,以便len(s) == 9 && s[0] == ??我想要更改字符串的格式,以便它在unicode点中12345s = '?? ?? hello'u = to_unicode(s) ...

weixin_39892842的博客 712

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Ansi transcode to unicode(UTF-8) tanscode to GBK

编码转换函数: string AnsiToUnicodeToGBK(const std::string& strOriginal) { int len = MultiByteToWideChar(CP_UTF8, 0, strOriginal.c_str(), -1, NULL, 0); unsigned short * wszUTF8 = new unsigned short[len +

818

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【ezupload】CTF+(利用Unicode字符绕过扩展名限制)(通过Caddy管理API解除限制未完全理解)

你可以把这个过程想象成“用错位的尺子量东西”两把尺子:原始路径(短尺),小写路径(长尺,因为字符膨胀被拉长了)。在长尺上做标记:在长尺的26cm处刻了一个标记(找到.php用长尺的标记去量短尺:直接把短尺对准长尺的26cm标记处。结果发现短尺根本够不到那个标记,短尺的尽头(25cm)还在标记之前。错误的结论:量取失败,但程序逻辑决定“那就取短尺的全部长度吧”。于是,我们隐藏在短尺(.txt文件)里的恶意代码就被完整地取出来执行了。这个漏洞的精妙之处在于,它利用了。

2503_93914976的博客 689

java9特性_Java9最新特性有哪些?

Java 9终于发布了,Java 开发工具包(JDK) 也已经可供开发者下载。Java 9终于有了 REPLJava 9的另一个特性是拥有了 REPL(read-eval-print loop)工具,这是另一个 Java 的长期目标,在 Kulia 项目中经过多年研发后终于在 Java 9 中得以实现。Java 9的 REPL 名为 jShell,以交互式的方式对语句和表达式进行求值。开发者只需要...

weixin_36081187的博客 168

API Hook完全手册

文章来源: http://blog.youkuaiyun.com/atfield原文作者: ATField整理日期: 2008-07-16注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章)。最近在论坛上看到有不少人在问关于API Hook的问题,便写成此文,希望能对朋友们在写API Hook代码的时候能够有所帮助。1 基本原理API Hook是什么我就不多说了,直接进入正题。AP...

weixin_34228662的博客 108

如何使用Unicode版和Ansi版API

版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明作者:xixi出处:http://blog.youkuaiyun.com/slowgrace/archive/2009/04/24/4105426.aspx本文来自对icansaymyabc、chenjl1031、cnzdgs、VBAdvisor、unsigned、Soyokaze、eglic、ahao、Tiger_

5627

在 VB 中使用 Unicode API

在 VB 中使用 Unicode API 介绍  也许大家都知道,Visual Basic 内部的所有和字符串相关的函数使用的都是 Unicode。  Unicode 是一套字符集。与其他传统单一字节的字符集不同的是,它使用两个字节来表示一个字符,这使得可用字符的数量大大增加(理论上说,一个字节可以包含最多 256 个字符,而两个字节可以包含 65536 个字符)。在这里请注意,不要把 GB231

James的专栏 1880

API入门系列之二 -Unicode还是ASCII

 原创文章,转载请注明作者及出处。 首发:http://blog.youkuaiyun.com/beyondcodehttp://www.cnblogs.com/beyond-code/http://hi.baidu.com/beyondcode今天,开始第二篇文章,这章我准备介绍一下Windows平台下编程中Unicode编码和ASCII编码的相关问题。不知道各位新手

BEYONDCODE's 流水账 6255

从GetWindowText到Unicode:Windows API编码演进史与技术抉择

本文深入探讨了Windows API从ANSI到Unicode的编码演进历程,重点解析了GetWindowText等关键API的双版本设计及其技术实现。文章详细介绍了Unicode在Windows系统中的内部机制、开发实践中的迁移策略,以及现代Windows开发的最佳实践,为开发者提供了处理字符编码问题的全面指南。

eee77的博客 1036

VB 中使用Unicode API速度快几倍

与其他传统单一字节的字符集不同的是,它使用两个字节来表示一个字符,这使得可用字符的数量大大增加(理论上说,一个字节可以包含最多 256 个字符,而两个字节可以包含 65536 个字符)。MsgBox "ANSI: 复制 '" & stra & "' " & CStr(COPY_TIMES) & " 次用了 " & CStr(t1) & " 毫秒" &并且它支持世界上的所有的常用文字,使得一个程序可以同时在屏幕上显示多种语言的文字,而不用关心当前的代码页。来复制一个字符串到另一个字符串。

404

Visual Studio——使用多字节字符集与使用Unicode字符集

vs配置选项“使用多字节字符集”和“使用Unicode字符集”的区别 VS集成开发环境,字符集选择“使用多字节字符集”和“使用Unicode字符集”的直接区别就是:编译器是否增加了宏定义——UNICODE。当选择“使用Unicode字符集”时,编译器会增加宏定义——UNICODE;而选择“使用多字节字符集”时,编译器则不会增加宏定义——UNICODE。 而是否增加了宏定义UNICODE,则...

huashuolin001的博客 2万+
上一篇: 30个源码网址
下一篇: WINDOWS的消息和窗口简介
dingdingko
博客等级 码龄20年 50粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值