中文转码器的工作原理_delphi教程
最近在做Delphi下的简体与繁体转换, 发现Windows2000自带的工具"中文转码器"很好用, 不仅可以转内码(BIG5-->GBK), 还可以将繁体字转为简体字(如:東-->东).
要转内码比较简单, 使用MultiByteToWideChar先将简体/繁体(GBK/BIG5)转为UniCode, 再使用WideCharToMultiByte从Unicode转为繁体/简体(BIG5/GBK).
EX:
function Big52GB( ABig5String: string): String;
{ BIG5 to GBK : BIG5 ==> Unicode ==> GBK }
Var
mWString: array[0..1024] of WideChar;
cchWideChar: Integer;
mLongBool: LongBool;
begin
Result := ABig5String; //分配空间
mLongBool := True;
//1.先取得需要的长度
cchWideChar := MultiByteToWideChar(950, 0, PChar(ABig5String), length(ABig5String), @mWString, 0);
// SetLength(mWString, cchWideChar+1);
//2.BIG5 to Unicode
MultiByteToWideChar(950, 0, PChar(ABig5String), length(ABig5String), @mWString, cchWideChar);
//3.Unicode to GBK
WideCharToMultiByte(936, 0, @mWString, cchWideChar, PChar(Result), length(Result), ?, @mLongBool);
end;
经过以上步骤, 就可以把BIG5码转为GBK码,但是繁体中的字因为在GBK中大部分都有对应(繁体字形),
因而,以上得到的是BIG5对应的繁体字形,如BIG5码的 “東”($AA46)得到的GBK对应的字为“東”($967C),而不是简体中最常用的“东”($B6AB)。
在中文转码器中,最后一页提供了是否转字形的选项,它可以做到!
那我们也应该可以做到!经过调试,原来它是调用LCMapStringW!
在Windows.pas中,定义了三个这样的函数:
function LCMapString(Locale: LCID; dwMapFlags: DWORD; lpSrcStr: PChar;
cchSrc: Integer; lpDestStr: PChar; cchDest: Integer): Integer; stdcall;
function LCMapStringA(Locale: LCID; dwMapFlags: DWORD; lpSrcStr: PAnsiChar;
cchSrc: Integer; lpDestStr: PAnsiChar; cchDest: Integer): Integer; stdcall;
function LCMapStringW(Locale: LCID; dwMapFlags: DWORD; lpSrcStr: PWideChar;
cchSrc: Integer; lpDestStr: PWideChar; cchDest: Integer): Integer; stdcall;
其中,LCMapString=LCMapStringA,也就是使用ASCII的,当然我们也可以使用LCMapStringW转UniCode成为简体字形。
转自:http://www.west263.com/www/info/57623-1.htm
中文转码器的工作原理_delphi教程的更多相关文章
- Java类加载器的工作原理
Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它. ...
- ld链接器的工作原理及链接顺序(转)
基礎知識 GNU ld 最基本的連結單位是 object 檔,即單一個編譯單元所對應的編譯結果,通常副檔名是 .o.在 object 檔所維護的資訊當中,連結器主要關注的是: 輸出符號: 這是定義在 ...
- AppScan工作原理&操作教程
一.AppScan的工作原理 对一个综合性的大型网站来说,可能存在成千上万的页面.以登录界面为例,至少要输入用户名和密码,即该页面存在两个字段,当提交了用户名和密码等登录信息,网站需要检查是否正确,这 ...
- SQL Server查询优化器的工作原理
SQL Server的查询优化器是一个基于成本的优化器.它为一个给定的查询分析出很多的候选的查询计划,并且估算每个候选计划的成本,从而选择一个成本最低的计划进行执行.实际上,因为查询优化器不可能对每一 ...
- DC DC降壓變換器ic 工作原理
目前DC/DC轉化器大致可分為:升壓型dc dc變化器.降壓型dc dc變化器及可升壓又可降壓dc dc變換器.我們今天主要提一下降壓型dc dc變換器的原理: 見下圖降壓變換器原理圖如圖1所示, 當 ...
- 安卓MonkeyRunner源码分析之工作原理架构图及系列集合
花了点时间整理了下MonkeyRunner的工作原理图,请配合本人博客里面MonkeyRunner其他源码分析文章进行阅读.下面整理成相应系列列表方便大家阅读: MonkeyRunner源码分析之-谁 ...
- Django之CBV视图源码分析(工作原理)
1.首先我们先在urls.py定义CBV的路由匹配. FBV的路由匹配: 2.然后,在views.py创建一名为MyReg的类: 注意:该类必须继续View类,且方法名必须与请求方式相同(后面会详解) ...
- 浅谈C++编译原理 ------ C++编译器与链接器工作原理
原文:https://blog.csdn.net/zyh821351004/article/details/46425823 第一篇: 首先是预编译,这一步可以粗略的认为只做了一件事情,那就 ...
- 微光互联 TX800-U 扫码器无法输出中文到光标的问题
问题背景 某检测场有一批扫码器,购于微光互联,型号 TX800-U,用于在不同办理窗口间扫描纸质材料上的二维码,简化录入过程.扫码器通过 USB 接入 PC 系统 (windows),自动安装驱动,接 ...
随机推荐
- sqoop1.4.7 导入数据到hive2.3.4 jackson版本问题
今天用sqoop往hive导入数据的时候,执行报错,错误信息为: java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.ObjectMa ...
- C语言格式化%整理
以输出为例: #include <stdio.h> main() { printf("**进制****************************************** ...
- solr 忽略大小写
1.types标签下加入如下fieldType <fieldType name="str_lower" class="solr.TextField" so ...
- 关于QT_Creator不能在线调试问题
电脑:W7+64位,QT:5_7_0(vs2015版本) 用QTcreator进行在线调试时出现找不到“engine...”,原因是没有在线调试软件 CDB下载地址:http://msdn.micro ...
- ElasticSearch 2 (1) - Getting Start
ElasticSearch 2.1.1 (1) - Getting Start Install & Up cd elasticsearch-2.1.1/bin ./elasticsearch ...
- Java图片压缩
package com.test; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGIma ...
- 重识linux-守护进程,系统服务,daemons
重识linux-守护进程,系统服务,daemons 1分类 分为 单独的守护进程 和超级守护进程 2命名 服务的名称被创建之后,被挂上linux使用,通常在服务的名称之后会加上一个d,例如at和cro ...
- 1.正则re
正则 :规则表达式 一般在匹配非结构化的数据时用的比较多,结构化的数据一般用xpath,bs4.但具体使用起来都是视情况而定,相对而言.正则规则平时涉及最多也就是匹配邮箱,电话,及特殊字符串.规则相对 ...
- getent passwd 不能访问到 ldap 的用户
getent passwd 不能访问到 ldap 的用户,搞了一整个下午! 依然没搞定, 一开始是不知道nslcd 需要启动,另外getent passwd 域, 无有用结果, 换个方式搜索 get ...
- 转载:老生常谈C++中实参形参的传递问题
以下文章转载自:http://www.jb51.net/article/108390.htm 函数中参数的传递 这里说的传递当然是指 实参是如何传递给形参的啦 还挺复杂的~~~~~~~~⊙﹏⊙b汗,这 ...