如题,求将简体unicode编码转成对应繁体big5编码的转换表及其使用方法,不够可再加分!

解决方案 »

  1.   

    如果你能找到 GB2312编码到BIG5转换的表,就容易制造出Unicode简体到BIG5转换表了。
    因为,在Windows里Unicode简体到GB2312转换是小事一件。
      

  2.   

    有个工具 Big52GB.exe, 用它可以实现GB2312 与 BIG5相互转换,可以用来制作一个 GB2312 to BIG5转换表。
      

  3.   

    Function Big52GB(BIG5Str: String): AnsiString;
    {进行big5转GB内码}
    Var
      Len: Integer;
      pBIG5Char: PChar;
      pGBCHSChar: PChar;
      pGBCHTChar: PChar;
      pUniCodeChar: PWideChar;
    Begin
      //String -> PChar
      pBIG5Char := PChar(BIG5Str);
      Len := MultiByteToWideChar(950, 0, pBIG5Char, -1, Nil, 0);
      GetMem(pUniCodeChar, Len * 2);
      ZeroMemory(pUniCodeChar, Len * 2);
      //Big5 -> UniCode
      MultiByteToWideChar(950, 0, pBIG5Char, -1, pUniCodeChar, Len);
      Len := WideCharToMultiByte(936, 0, pUniCodeChar, -1, Nil, 0, Nil, Nil);
      GetMem(pGBCHTChar, Len * 2);
      GetMem(pGBCHSChar, Len * 2);
      ZeroMemory(pGBCHTChar, Len * 2);
      ZeroMemory(pGBCHSChar, Len * 2);
      //UniCode->GB CHT
      WideCharToMultiByte(936, 0, pUniCodeChar, -1, pGBCHTChar, Len, Nil, Nil);
      //GB CHT -> GB CHS
      LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len);
      Result := String(pGBCHSChar);
      FreeMem(pGBCHTChar);
      FreeMem(pGBCHSChar);
      FreeMem(pUniCodeChar);
    End;Function GB2Big5(GBStr: String): AnsiString;
    {进行GB转BIG5内码}
    Var
      Len: Integer;
      pGBCHTChar: PChar;
      pGBCHSChar: PChar;
      pUniCodeChar: PWideChar;
      pBIG5Char: PChar;
    Begin
      pGBCHSChar := PChar(GBStr);
      Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, Nil, 0);
      GetMem(pGBCHTChar, Len * 2 + 1);
      ZeroMemory(pGBCHTChar, Len * 2 + 1);
      //GB CHS -> GB CHT
      LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);
      GetMem(pUniCodeChar, Len * 2);
      ZeroMemory(pUniCodeChar, Len * 2);
      //GB CHT -> UniCode
      MultiByteToWideChar(936, 0, pGBCHTChar, -1, pUniCodeChar, Len * 2);
      Len := WideCharToMultiByte(950, 0, pUniCodeChar, -1, Nil, 0, Nil, Nil);
      GetMem(pBIG5Char, Len);
      ZeroMemory(pBIG5Char, Len);
      //UniCode -> Big5
      WideCharToMultiByte(950, 0, pUniCodeChar, -1, pBIG5Char, Len, Nil, Nil);
      Result := String(pBIG5Char);
      FreeMem(pBIG5Char);
      FreeMem(pGBCHTChar);
      FreeMem(pUniCodeChar);
    End;Function GBCht2Chs(GBStr: String): AnsiString;
    {进行GBK繁体转简体}
    Var
      Len: Integer;
      pGBCHTChar: PChar;
      pGBCHSChar: PChar;
    Begin
      pGBCHTChar := PChar(GBStr);
      Len := MultiByteToWideChar(936, 0, pGBCHTChar, -1, Nil, 0);
      GetMem(pGBCHSChar, Len * 2 + 1);
      ZeroMemory(pGBCHSChar, Len * 2 + 1);
      //GB CHS -> GB CHT
      LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len * 2);
      Result := String(pGBCHSChar);
      FreeMem(pGBCHSChar);
    End;Function GBChs2Cht(GBStr: String): AnsiString;
    {进行GBK简体转繁体}
    Var
      Len: Integer;
      pGBCHTChar: PChar;
      pGBCHSChar: PChar;
    Begin
      pGBCHSChar := PChar(GBStr);
      Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, Nil, 0);
      GetMem(pGBCHTChar, Len * 2 + 1);
      ZeroMemory(pGBCHTChar, Len * 2 + 1);
      //GB CHS -> GB CHT
      LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);
      Result := String(pGBCHTChar);
      FreeMem(pGBCHTChar);
    End;
      

  4.   

    To ahjoe:
    我找到了,还带转换程序的,但是转换一点效果都没有To laihongbo524:
    你的方法是GBK的简体转换为GBK的繁体的,编码仍然是GBK,在繁体平台显示仍然是乱码,我试过了的。  所以一定要找到GBK到Big5的转换表,而不是只简单的在GBK内部转!
      

  5.   

    在简体中文Windows里试了一下, laihongbo524(风铃夜思雨) 提供的代码可以实现在GBK编码范围内的简繁字转换。有了这个要做一个Unicode转Big5的表也不难了。
      

  6.   

    以GB2312编码范围为例
    1. 制造一个GB2312所有字符的文件,并给每个字符留下存储转码的空间
    类似结构 
    record 
    cChar1: array [0..1] of Byte;//现在保存GB2312(最终将保存Unicode简体)
    cChar2: array [0..1] of Byte;//保存目标编码
    end;
    2. 利用laihongbo524的代码实现简繁转换, 转换后的繁体字保存在cChar2位置
    3. 将简体字与繁体字都转成Unicode, 在Windows里要进行本地编码与Unicode的转换就很简单了
    s: string
    ws: WideString
    ws := s;
    转换后, 保存Unicode简体在cChar1位置, Unicode繁体在 cChar2位置
    4. 在Big5系统下,再将cChar2位置的Unicode繁体字转成Big5编码,也是一样简单
    s: string
    ws: WideString
    s := ws;
    转换后,保存Big5繁体在cChar2位置。
    5. 对最终生成的 Unicode -> Big5表按Unicode进行排序, 以加快使用时的查找速度
      

  7.   

    不好意思,搞错了
    laihongbo524提供的代码已经可以生成 Big5码了。
      

  8.   

    有谁知道如何判断某个字是属于GBK繁体还是属于BIG5呀?