Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新的字符串类型在Delphi 2009/2010中是如何工作的?_Delphi_Unicode_String_Delphi 2009 - Fatal编程技术网

新的字符串类型在Delphi 2009/2010中是如何工作的?

新的字符串类型在Delphi 2009/2010中是如何工作的?,delphi,unicode,string,delphi-2009,Delphi,Unicode,String,Delphi 2009,我必须将一个大型的遗留应用程序转换为Delphi 2009,它到处使用字符串、ansistring、wideString和UTF8数据,我很难理解新的字符串类型是如何工作的以及它们应该如何使用 应用程序完全支持使用TntUnicodeControls的Unicode,并且有第三方DLL需要特定编码中的字符串,主要是UTF8和UTF16,这使得转换任务不像人们想象的那么简单 我尤其在C DLL调用和选择正确类型方面有问题。 我还得到这样的印象,即有许多隐式字符串转换正在发生,因为其中一个DLL似乎

我必须将一个大型的遗留应用程序转换为Delphi 2009,它到处使用字符串、ansistring、wideString和UTF8数据,我很难理解新的字符串类型是如何工作的以及它们应该如何使用

应用程序完全支持使用TntUnicodeControls的Unicode,并且有第三方DLL需要特定编码中的字符串,主要是UTF8和UTF16,这使得转换任务不像人们想象的那么简单

我尤其在C DLL调用和选择正确类型方面有问题。 我还得到这样的印象,即有许多隐式字符串转换正在发生,因为其中一个DLL似乎总是接收UTF-8编码的字符串,而不管Delphi字符串是如何编码的

有人能简要介绍一下新的Delphi 2009字符串类型UnicodeString和RawByteString吗?也许还有一些使用提示和转换2009年以前的应用程序时可能遇到的陷阱?

请参阅Marco Cantù和我猜写的白皮书 ,由乔尔写

一个陷阱是默认的Win32 API调用已映射为使用W(宽字符串)版本而不是A(ANSI)版本,例如
ShellExecuteA
,如果您的代码正在执行复杂的指针代码,假设内部布局为
AnsiString
,则它将中断。退一步是用
PAnsiChar
替换
PChar
Char
替换
AnsiChar
string
替换
AnsiString
,并在Win32 API调用的末尾为该部分代码追加一个。在代码实际编译并正常运行后,您可以重构代码以使用
string
UnicodeString
)。

本周五观看我关于“在程序中使用Unicode和其他编码”的演讲,或者等到在线重播

我将介绍一些编码并解释字符串格式

这些幻灯片很快就会面世(我今天会设法把它们放到网上),其中包含了很多你应该在互联网上阅读的内容(但我必须承认我忘记了eed3si9n发布的Unicode上Joel的链接)

今天将使用上传和链接编辑此答案


编辑:

如果您有一个小示例,其中可以显示您的C/C++DLL接收到UTF8编码的字符串,但认为应该对其进行编码,请将其发送给我(给我发邮件;pluimers.com上的几乎所有内容都可以找到我,特别是如果您在at标志之前使用我的名字)

现在可以使用会话材料,包括“在程序中使用Unicode和其他编码”会话

以下是该会议的链接:

请阅读以下内容:

  • 马可·坎图,白皮书“
  • 马可·坎图,演讲“
  • 尼克·霍奇斯,白皮书“
  • 相关在线帮助主题:

  • 字符串类型:
  • 字符串类型:
  • 字符串类型:
  • 字符串类型:
  • 字符串类型:
  • 字符串PChar转换:
  • 字符串PChar转换:
  • 字符串PChar转换:

  • 希望这能让你走。如果没有,请发邮件给我,我将尝试在这里扩展答案。

    请注意,它不仅涉及真正的字符串代码。它还访问了使用PCHAR搜索缓冲区或与API接口的代码


    例如,动态加载DLL的头的初始化代码(getprocedureaddress/LoadLibrary)

    似乎我所有的问题都来自分配到
    UTF8String
    的自动转换

    我已经有了使用
    UTF8String
    的旧代码,只是为了帮助我考虑变量应该包含哪种类型的字符串

    在开始移植我的应用程序时,出于同样的原因,我将
    AnsiString
    替换为
    UTF8String
    ,但代码依赖于
    UTF8String
    只是(经典)
    AnsiString

    现在随着自动转换,这一假设不再成立,这造成了许多问题


    从2009年以前的Delphi代码移植时,如果使用
    UTF8String
    ,请小心

    另一个需要注意的是,在用Delphi或C++ Builder的不同版本构建的DLL之间传递字符串时,从2009开始,ANSIRTRIGBASE的STRRC部分就得到了两个额外的字段;代码页和电子化。它们每个有2个字节(短整数),因此StrRec的大小现在是12个字节,而不是8个字节。这可能会导致无效指针异常问题,导致内存分配和破坏,即使字符串的数据部分传输正常。

    考虑到Unicode不是编码,这是一个奇怪的标题,但是(引用Wikipedia):“Unicode可以通过不同的字符编码实现。”作为非英语母语人士,我想不出一个简短的标题能正确地涵盖这个主题。如果你有,请告诉我。我很乐意更改标题。我也不是一个母语为英语的人,但我认为目前的标题包含了一个错误的陈述,这很不幸,因为人们对Unicode有太多的误解。“使用Unicode并选择编码…”更正确。因为我不知道你的演讲,所以我不知道这是不是一个更好的标题。谢谢!我将尝试将所有内容重命名为“使用Unicode并在程序中选择文本/字符串编码”。作为一名英语母语人士,我认为这个标题很好。它是“(使用Unicode)和(其他编码)”而不是“使用(Unicode和其他编码)”。这并不精确,但这就是英语的本质,不是吗?:-)我问了一个类似的问题。并非所有这些都适用,但人们提供的一些链接和答案可能对你有用;看到和