【问题标题】:How can I convert string encoded with Windows Codepage 1251 to a Unicode string如何将使用 Windows Codepage 1251 编码的字符串转换为 Unicode 字符串
【发布时间】:2011-11-05 13:29:04
【问题描述】:

我的应用接收到的西里尔文字符串使用(我相信)下表:

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

问题:如何将这样的东西转换为字符串,在我的 delphi 中默认为 unicode? 或者更好:delphi 中有现成的转换器还是我应该写一个?

【问题讨论】:

  • 你必须告诉我们你有什么版本的Delphi以及什么数据结构保存输入字符串

标签: string delphi character-encoding


【解决方案1】:

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

【讨论】:

  • 我的印象是西里尔文字符串不能用作文字。
  • @David:不,我认为他们不是,但话又说回来,我从来没有说过他们是。但是您始终可以手动“编码”您的 1251 字符串:var UnicodeStr: string; CryllicStr: CryllicString; begin SetLength(CryllicStr, 1); CryllicStr[1] := char(255); UnicodeStr := CryllicStr; ShowMessage(UnicodeStr); 或者,甚至看起来很陌生:CryllicStr := 'ÿ';。两种方法都将显示я 字符。
  • @Daivd:无论如何,我的印象是 OP 不知何故已经得到了一个 1251 编码的字符串......
  • 完全正确,但可能不在 AnsiString(1251) 变量中。
  • “我的印象是西里尔文字符串不能用作文字。”这取决于源文件的代码页。
【解决方案2】:

首先我建议你阅读Marco Cantù's whitepaper on Unicode in Delphi。我还从您的问题(和以前的问题)中假设您使用的是 Unicode 版本的 Delphi,即 D2009 或更高版本。


您可以首先使用代码页 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      相关资源
      最近更新 更多