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

String 如何将使用Windows代码页1251编码的字符串转换为Unicode字符串,string,delphi,character-encoding,String,Delphi,Character Encoding,我的应用程序接收的cyrllic字符串使用(我相信)下表: 说我相信,因为我测试的所有字符都符合这张表 问题:如何将此类内容转换为字符串,在我的delphi中默认为unicode? 或者更好:delphi中是否有现成的转换器,或者我是否应该编写一个?如果您使用的是delphi 2009或更高版本,这将自动完成: type CyrillicString = type AnsiString(1251); procedure TForm1.FormCreate(Sender: TObject)

我的应用程序接收的cyrllic字符串使用(我相信)下表:

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

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

如果您使用的是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;

首先,我建议你阅读。我还根据您的问题(以及之前的问题)假设您使用的是Delphi的Unicode版本,即D2009或更高版本


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

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

Windows API MultiByteToWideChartMultiByte()和WideChartMultiByte()可用于在Windows中与任何受支持的代码页之间进行转换。当然,如果您使用Delphi>=2009,那么使用本机unicode支持就更容易了。

您必须告诉我们您使用的是什么版本的Delphi以及保存输入字符串的数据结构。我得到的印象是西里尔文字符串不能作为文本使用。@David:不,我想不是,但我从来没有说过它们是。但您始终可以手动“编码”1251字符串:
var unicodest:string;CryllicStr:CryllicString;开始设定长度(CryllicStr,1);CryllicStr[1]:=char(255);UNICODEST:=CryllicStr;ShowMessage(unicodest)或者,甚至是陌生人的表情:
CryllicStr:=“ÿ”。这两种方法都会显示一个
字符。@Daivd:无论如何,我得到的印象是,OP已经以某种方式获得了一个1251编码的字符串……准确地说,但可能不在AnsiString(1251)变量中。“我得到的印象是西里尔文字符串不能作为文本使用。”这取决于源文件的代码页。