如何将使用Windows代码页1251编码的字符串转换为Unicode字符串

时间:2011-08-28 17:33:02

标签: string delphi character-encoding

我的应用程序收到的cyrllic字符串使用(我相信)下表: enter image description here

我相信,因为我测试的所有字符都适合这张表。

问题:如何将此类事物转换为字符串,默认情况下在我的delphi中是unicode? 或者更好的是:delphi中是否有现成的转换器,还是应该写一个?

3 个答案:

答案 0 :(得分:7)

如果您使用的是Delphi 2009或更高版本,则会自动完成:

type
  CyrillicString = type AnsiString(1251);

procedure TForm1.FormCreate(Sender: TObject);
var
  UnicodeStr: string;
  CyrillicStr: CyrillicString;
begin
  UnicodeStr := 'This is a test.'; // Unicode string
  CyrillicStr := UnicodeStr; // ...converted to 1251

  CyrillicStr := 'This is a test.'; // Cryllic string
  UnicodeStr := CyrillicStr; // ...converted to Unicode
end;

答案 1 :(得分:4)

首先,我建议您阅读Marco Cantù's whitepaper on Unicode in Delphi。我还假设您正在使用Unicode版本的Delphi,即D2009或更高版本。(/ p>


您首先可以使用代码页1251定义一个AnsiString来匹配您的输入数据。

type
  CyrillicString = type Ansistring(1251);

这是重要的一步。它表示包含在此类变量中的任何数据都将被解释为已使用1251代码页进行编码。这允许Delphi对其他字符串类型执行正确的转换,我们将在后面看到。

接下来将输入数据复制到此变量的字符串中。

function GetCyrillicString(const Input: array of Byte): CyrillicString;
begin
  SetLength(Result, Length(Input));
  if Length(Result)>0 then
    Move(Input[0], Result[1], Length(Input));
end;

当然,可能还有其他更方便的方法来获取数据。也许它来自流。无论如何,请确保使用与内存副本等效的内容进行操作,这样就不会调用代码页转换,从而失去1251编码。

最后,您可以简单地将CyrillicString分配给普通的Unicode string变量,Delphi运行时会自动执行必要的转换。

function ConvertCyrillicToUnicode(const Input: array of Byte): string;
begin
  Result := GetCyrillicString(Input);
end;

运行时能够执行此转换,因为您在定义CyrillicString时指定了代码页,并且因为string映射到使用UTF-16编码的UnicodeString

答案 2 :(得分:1)

Windows API MultiByteToWideChar()和WideCharToMultiByte()可用于在Windows中与任何受支持的代码页进行转换。当然,如果您使用Delphi> = 2009,则更容易使用本机unicode支持。