我的应用程序收到的cyrllic字符串使用(我相信)下表:
我相信,因为我测试的所有字符都适合这张表。
问题:如何将此类事物转换为字符串,默认情况下在我的delphi中是unicode? 或者更好的是:delphi中是否有现成的转换器,还是应该写一个?
答案 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支持。