首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi unicode移植:不兼容的类型:'Char‘和'AnsiChar’错误的Win32函数,如CharToOEM?

Delphi unicode移植:不兼容的类型:'Char‘和'AnsiChar’错误的Win32函数,如CharToOEM?
EN

Stack Overflow用户
提问于 2012-03-14 02:10:29
回答 2查看 8.5K关注 0票数 7

我正在尝试将一些旧的Delphi 7代码转换到Delphi 2010

代码语言:javascript
运行
复制
function AnsiToDOS(S: String): String;
begin
  SetLength(Result, Length(S));
  if S <> '' then begin
     CharToOEM(PChar(S), PChar(Result));
  end;
end;

我得到“不兼容的类型:'Char‘和'AnsiChar’”错误:

在中找到CharToOEM (外部User32函数)

Windows.pas单元

我可以以某种方式重写这个AnsiToDos函数吗?或者我需要编写自己的CharToOEM例程吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-14 02:21:58

在Unicode Delphi中,CharToOem映射到具有以下签名的Unicode版本CharToOemW

代码语言:javascript
运行
复制
function CharToOem(Source: PWideChar; Dest: PAnsiChar): BOOL; stdcall;

因此,您需要提供ANSI输出缓冲区,但是您的代码提供了Unicode输出缓冲区。

自然转换是切换到AnsiString返回值。同时,将函数重命名为StringToOem,以更好地反映它所做的事情。

代码语言:javascript
运行
复制
function StringToOem(const S: String): AnsiString;
begin
  SetLength(Result, Length(S));
  if S <> '' then begin
    CharToOem(PChar(S), PAnsiChar(Result));
  end;
end;

另一种方法是就地转换为OEM,但为此需要传入ANSI字符串并显式调用API调用的ANSI版本。

代码语言:javascript
运行
复制
function AnsiStringToOem(const S: AnsiString): AnsiString;
begin
  Result := S;
  UniqueString(Result);
  if S <> '' then begin
    CharToOemA(PAnsiChar(Result), PAnsiChar(Result));
  end;
end;

我不得不说,我很惊讶地看到OEM字符集在现代仍然被积极使用。我以为它已经像恐龙一样消失了!

票数 6
EN

Stack Overflow用户

发布于 2015-10-08 00:35:17

最简单的是(在C++Builder中):

代码语言:javascript
运行
复制
typedef AnsiStringT<850> OEMString;
AnsiString (or String) aStr = L"my ansi text";
OEMString oStr = aStr;  // convert
cout << oStr.c_str() << endl;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9689650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档