请注意,sarnold对此问题进行了大量编辑; 原始问题完整地作为评论保留在问题中.如果我做了一些不清楚的事情,也许原来的帖子会有所帮助.(我将其留作评论,因此未来的编辑不需要总是参考问题编辑历史.)
我正在使用Delphi Xe2,需要帮助理解如何正确使用ANSI字符串,Unicode字符串和宽字符串,特别是在编写用于其他语言的DLL(例如VB,C++或C#)时.
我需要使用Delphi Xe2编写DLL来对Unicode字符串执行简单的字符串操作.此DLL需要与一个SimpleShareMem或
ShareMem多个内存管理器一起工作.此DLL需要可以从外部语言(如VB,C++和C#)调用.
默认情况下,字符串现在应该是Unicode字符串.我们应该使用Embarcadero来处理这些字符串吗?
字符串是:(a)不支持Unicode的单字节字符或(b)宽字符串,其中每个字符需要两个字节.(这些支持Unicode,但它们不是UTF-8字符串.)
有两种指针类型可用:PAnsiChar和PWideChar(没有PUnicodeChar指针可用).PChar是别名
PWideChar- 这是否意味着我们总是需要2 * length
为这些字符串分配内存量?(同样,我们需要将内存除以2得到这些字符串的长度吗?)
对于字符串常量,我们是否需要在源代码中标记字符串的类型?例如:
Const MyCo = 'test';
Run Code Online (Sandbox Code Playgroud)
要么
Const MyCo = WideString('test');
Run Code Online (Sandbox Code Playgroud)
当我们在字符串变量之间执行赋值时怎么样?
s := st;
Run Code Online (Sandbox Code Playgroud)
这应该重写:
s := WideString(st);
Run Code Online (Sandbox Code Playgroud)
我们应该在字符串中包含Unicode字节顺序标记吗?我们应该如何在字符串中包含BOM?
我们应该如何使用不同Windows代码页中的ANSI字符串?如果我们收到代码页为1200的ANSI字符串,我们应该重新编码字符串还是按原样使用它?
我们应该如何使用TEncoding类在Unicode,UTF-8,WideString和AnsiString类之间进行转换?
使用宽字符串或Unicode字符串是否有严重的性能损失?
在使用通用内存管理器时,我们是否应该编写接口以仅需要使用WideString变体?
如果我们写的接口需要长度参数PChar,
PAnsiChar以及PWideChar参数类型?
如何编写我们的接口来确定文件是以Unicode,UTF-8,ANSI还是宽字符存储?我们应该如何确定将文件写回时使用的格式?
我们应该只使用程序吗?或者功能也可以吗?
谢谢,新年快乐.
我得到的印象是Gu正在从Delphi 7转向支持Unicode的版本(D2009 +),并正在寻找有关如何处理新字符串的建议.
Cary Jensen的白皮书Delphi Unicode Migration for Mere Mortals解决了问题中提出的大多数(如果不是全部)问题.
我通常会把它放在评论中,但是评论列表已经很久了,我觉得在答案中更容易找到链接(这可能有助于更多人而不仅仅是顾).