Delphi 将字符串从某个代码页转换为Unicode

Delphi 将字符串从某个代码页转换为Unicode,delphi,delphi-xe,codepages,Delphi,Delphi Xe,Codepages,我想将CP-1253字符串转换为Unicode,并执行相反的转换 假设我有两个变量保存字符串,一个MySource1253和一个MyUnicodeTarget 我假设ansisting是MySource1253的合适类型,而String应该适合MyUnicodeTarget,如果我错了,请纠正我 Delphi XE中是否有一些函数可以将这些转换从一个转换到另一个,反之亦然 宣布: type GreekString = type Ansistring(1253); 要在它们之间进行转换,只需

我想将CP-1253字符串转换为Unicode,并执行相反的转换

假设我有两个变量保存字符串,一个
MySource1253
和一个
MyUnicodeTarget

  • 我假设
    ansisting
    MySource1253
    的合适类型,而
    String
    应该适合
    MyUnicodeTarget
    ,如果我错了,请纠正我

  • Delphi XE中是否有一些函数可以将这些转换从一个转换到另一个,反之亦然

  • 宣布:

    type
      GreekString = type Ansistring(1253);
    
    要在它们之间进行转换,只需使用以下代码:

    var
      UnicodeStr: string;
      GreekStr: GreekString;
    begin
      UnicodeStr := 'This is a test.'; // Unicode string
      GreekStr := GreekString(UnicodeStr); // ...converted to 1253
    
      GreekStr := 'This is a test.'; // Greek string
      UnicodeStr := string(GreekStr); // ...converted to Unicode
    end;
    

    另请参见:.

    只需调用RawByTestRingToInocDestring,并将AnsiString作为第一个参数传递,将代码页(1253)作为第二个参数传递

    MyUnicodeString := RawByteStringToUnicodeString(MyAnsiString, 1253);
    
    以下是从AnsiString(RawByteString)转换为Unicode并返回的函数。它们是Win32 MultiByteToWideChar/WideCharToMultiByte的安全包装

    uses
      Windows, Math;
    
    
    function RawByteStringToUnicodeString(const S: RawByteString; CP: Integer): UnicodeString;
    var
      P: PAnsiChar;
      pw: PWideChar;
      I, J: Integer;
    begin
      Result := '';
      if S = '' then
        Exit;
      if CP = CP_UTF8 then
      begin
        // UTF8
        Result := UTF8ToUnicodeString(S);
        Exit;
      end;
      P := @S[1];
      I := MultiByteToWideChar(CP, 0, P, Length(S), nil, 0);
      if I <= 0 then
        Exit;
      SetLength(Result, I);
      pw := @Result[1];
      J := MultiByteToWideChar(CP, 0, P, Length(S), pw, I);
      if I <> J then
        SetLength(Result, Min(I, J));
    end;
    
    
    function UnicodeStringToRawByteString(const w: UnicodeString; CP: Integer): RawByteString;
    var
      P: PWideChar;
      I, J: Integer;
    begin
      Result := '';
      if w = '' then
        Exit;
      case CP of
        CP_UTF8:
          begin
            // UTF8
            Result := UTF8Encode(w);
            Exit;
          end;
        CP_UNICODE_LE:
          begin
            // Unicode codepage
            CP := CP_ACP;
          end;
      end;
    
      P := @w[1];
      I := WideCharToMultibyte(CP, 0, P, Length(w), nil, 0, nil, nil);
      if I <= 0 then
        Exit;
      SetLength(Result, I);
      J := WideCharToMultibyte(CP, 0, P, Length(w), @Result[1], I, nil, nil);
      if I <> J then
        SetLength(Result, Min(I, J));
      SetCodePage(Result, CP, False);
    end;
    
    使用
    Windows、数学;
    函数RawByTestRingToInocDestring(常量S:RawByteString;CP:Integer):UnicodeString;
    变量
    P:潘斯卡尔;
    pw:PWideChar;
    一、 J:整数;
    开始
    结果:='';
    如果S='',那么
    出口
    如果CP=CP\u UTF8,则
    开始
    //UTF8
    结果:=UTF8-1/S;
    出口
    结束;
    P:=@S[1];
    I:=MultiByteToWideChar(CP,0,P,长度,nil,0);
    
    如果我想知道您要使用哪种Unicode编码。数据的格式是什么?在进行转换时,必须使用显式类型转换以避免编译器发出“隐式类型转换”警告。UnicodeAnsi转换可能有损,因此您必须告诉编译器您理解并接受这种风险。此外,RTL还具有
    LocaleCharsFromUnicode()
    UnicodeFromLocaleChars()
    函数,这些函数对字符缓冲区而不是字符串进行操作。