RawByteString 到 PWideChar 的可疑类型转换
Suspicious typecast of RawByteString to PWideChar
我在 Delphi 代码中将 libxml2 (http://www.xmlsoft.org/) 用于 reading/writing xml 文件。 libxml2 对所有字符串使用 UTF-8 编码。
例如函数xmlsavefile在libxml2中定义为
int xmlSaveFile (const char * filename, xmlDocPtr cur)
在 libxml2 Delphi 绑定中,此函数被翻译为
const LIBXML2_SO = 'libxml2-2.dll';
function xmlSaveFile(const FileName: PChar; cur: xmlDocPtr) : Longint; cdecl; external LIBXML2_SO;
这个函数可以作为
var FileName : string;
xmlSaveFile(PChar(Utf8Encode(FileName)), doc);
这似乎没有任何问题,并且已经用包括中文在内的多种语言进行了测试。但是,我收到编译器警告
RawByteString 到 PWideChar 的可疑类型转换
由于一切正常,我倾向于忽略此警告。尽管如此,
- 我可以去掉这个警告吗?
- 我会遇到任何问题吗?
错误在导入函数的声明中:
function xmlSaveFile(const FileName: PChar; cur: xmlDocPtr) : Longint; cdecl;
external LIBXML2_SO;
此函数接受 8 位 UTF8 编码的文件名。从将文件名参数声明为 const char *
.
的 C 代码中可以看出这一点
将代码更改为:
function xmlSaveFile(const FileName: PAnsiChar; cur: xmlDocPtr) : Longint; cdecl;
external LIBXML2_SO;
然后通过:
PAnsiChar(Utf8Encode(FileName))
您使用的 Delphi 绑定已过时,可能是在 Delphi 2009 年之前编写的,当时 (P)Char
仍然是 (P)AnsiChar
的别名。从 Delphi 2009 年开始,(P)Char
现在是 (P)WideChar
的别名。所以编译器警告是正确的——你确实是在将 UTF8Encode()
返回的 RawByteString
类型转换为 PWideChar
而不是 [=],这是一个基于 AnsiChar
的字符串22=].
您需要更新绑定(或获取更新版本,或找到已进行更新的不同绑定)以在 libxml2
使用 [=25] 的任何地方显式使用 PAnsiChar
=] 字符串,例如:
function xmlSaveFile(const FileName: PAnsiChar; cur: xmlDocPtr) : Longint; cdecl; external LIBXML2_SO;
然后更新您的代码以匹配:
var FileName : string;
xmlSaveFile(PAnsiChar(UTF8Encode(FileName)), doc);
var FileName : string;
xmlSaveFile(PAnsiChar(UTF8String(FileName)), doc);
var FileName : UTF8String;
xmlSaveFile(PAnsiChar(FileName), doc);
我在 Delphi 代码中将 libxml2 (http://www.xmlsoft.org/) 用于 reading/writing xml 文件。 libxml2 对所有字符串使用 UTF-8 编码。
例如函数xmlsavefile在libxml2中定义为
int xmlSaveFile (const char * filename, xmlDocPtr cur)
在 libxml2 Delphi 绑定中,此函数被翻译为
const LIBXML2_SO = 'libxml2-2.dll';
function xmlSaveFile(const FileName: PChar; cur: xmlDocPtr) : Longint; cdecl; external LIBXML2_SO;
这个函数可以作为
var FileName : string;
xmlSaveFile(PChar(Utf8Encode(FileName)), doc);
这似乎没有任何问题,并且已经用包括中文在内的多种语言进行了测试。但是,我收到编译器警告
RawByteString 到 PWideChar 的可疑类型转换
由于一切正常,我倾向于忽略此警告。尽管如此,
- 我可以去掉这个警告吗?
- 我会遇到任何问题吗?
错误在导入函数的声明中:
function xmlSaveFile(const FileName: PChar; cur: xmlDocPtr) : Longint; cdecl;
external LIBXML2_SO;
此函数接受 8 位 UTF8 编码的文件名。从将文件名参数声明为 const char *
.
将代码更改为:
function xmlSaveFile(const FileName: PAnsiChar; cur: xmlDocPtr) : Longint; cdecl;
external LIBXML2_SO;
然后通过:
PAnsiChar(Utf8Encode(FileName))
您使用的 Delphi 绑定已过时,可能是在 Delphi 2009 年之前编写的,当时 (P)Char
仍然是 (P)AnsiChar
的别名。从 Delphi 2009 年开始,(P)Char
现在是 (P)WideChar
的别名。所以编译器警告是正确的——你确实是在将 UTF8Encode()
返回的 RawByteString
类型转换为 PWideChar
而不是 [=],这是一个基于 AnsiChar
的字符串22=].
您需要更新绑定(或获取更新版本,或找到已进行更新的不同绑定)以在 libxml2
使用 [=25] 的任何地方显式使用 PAnsiChar
=] 字符串,例如:
function xmlSaveFile(const FileName: PAnsiChar; cur: xmlDocPtr) : Longint; cdecl; external LIBXML2_SO;
然后更新您的代码以匹配:
var FileName : string;
xmlSaveFile(PAnsiChar(UTF8Encode(FileName)), doc);
var FileName : string;
xmlSaveFile(PAnsiChar(UTF8String(FileName)), doc);
var FileName : UTF8String;
xmlSaveFile(PAnsiChar(FileName), doc);