String 如何将使用Windows代码页1251编码的字符串转换为Unicode字符串
我的应用程序接收的cyrllic字符串使用(我相信)下表: 说我相信,因为我测试的所有字符都符合这张表 问题:如何将此类内容转换为字符串,在我的delphi中默认为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)
或者更好: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
分配给一个普通的Unicodestring
变量,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)变量中。“我得到的印象是西里尔文字符串不能作为文本使用。”这取决于源文件的代码页。