现有汉字编码主要有以下三种GBK(包括GB2312):大陆等地用
Big5: 台湾用
Unicode:   全世界用GBK 编码中包括 简体字 与 繁体字
Big 只有繁体字
UniCode有简也有繁由于当前很多编辑组件,存储方式都还没前进到Unicode之一步,所以我们主要讨论GBK 与 BIG5的转换问题0.如何设别文档是GBK编码还是BIG编码?1.如何 实现GBK 简体 与 GBK 繁体之间的互相转换?2.如何 实现 GBK 繁体与 BIG 繁体之彰的互相转换

解决方案 »

  1.   

    // 以来代码由CSDN网友提供
    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;