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

时间:2016-12-03 13:22:49

标签: delphi delphi-xe codepages

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

假设我有两个包含字符串的变量,MySource1253MyUnicodeTarget

  1. 我认为AnsiStringMySource1253的合适类型,而String应该适合MyUnicodeTarget,如果我错了,请纠正我。< / p>

  2. Delphi XE中是否有一些功能可以将这些转换从一个转换为另一个,反之亦然?

2 个答案:

答案 0 :(得分:2)

宣告:

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;

另请参阅:How can I convert string encoded with Windows Codepage 1251 to a Unicode string

答案 1 :(得分:0)

只需调用RawByteStringToUnicodeString并将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;