zoukankan      html  css  js  c++  java
  • 中文转码器的工作原理_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

  • 相关阅读:
    codeforces 1251 F. Red-White Fence
    NTT 模板
    快速傅里叶变换模板
    codeforces 1251E (贪心)
    平衡树
    lucas定理
    P3709 大爷的字符串题 (莫队)
    洛谷 P3258 [JLOI2014]松鼠的新家 (树链剖分或树上差分)
    算法-图(5)深度优先遍历图
    计算机网络-链路层(3)交换局域网
  • 原文地址:https://www.cnblogs.com/yzryc/p/6401717.html
Copyright © 2011-2022 走看看