1 delphi string unicode compatibility utf-8
我正在尝试使一些String处理例程与最新的delphi版本兼容.我正在使用Delphi2005和2007,但我不完全确定它的兼容性.
以下是一些示例,它们是否与旧的和新的字符串类型兼容?(我将使用一个虚构的STRING_UNICODE指令).
a类型定义:
{$IFNDEF UNICODE_STRING}
TextBuffer = Array[0..13] Of Char;
{$ELSE}
TextBuffer = Array[0..13] Of WideChar;
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
无用与否?在Unicode字符串之前是Char类型(成为什么)WideChar,还是存在差异?
功能:
Function RemoveBlanks(Text: String): String;
Var
i: integer;
Begin
result := '';
For i:= 0 To Length(Text) Do
Begin
{$IFNDEF UNICODE_STRING}
If Byte(Text[i]) < 21 Then Continue;
{$ELSE}
If Word(Text[i]) < 21 Then Continue;
{$ENDIF}
If Text[i] = ' ' Then Continue;
Result := Result + Text[i];
End;
Run Code Online (Sandbox Code Playgroud)
Word()的投射是否正常?
这里也有' '
问题.如何在Unicode版本中处理空间?我是否还应该使用该指令来区分' '
和/ ' '
或将' '
自动处理为2字节的空白?
跳线:
NewLineBegin := CanReadText( aPTextBuffer, #13#10 );
Run Code Online (Sandbox Code Playgroud)
如何#13#10
在Unicode版本中解释第二个参数()?它兼容吗?它会被转换为字节块00130010
吗?如果没有,那么该指令应该与常量一起使用#0013#0010
吗?
首先要做的是阅读MarcoCantú关于Unicode的论文:http://edn.embarcadero.com/article/38980
问题1
只需在没有条件代码的情况下始终使用Char,它将适用于新旧.
Char是一种特殊类型,在旧版本的Delphi中是8位类型,在新的Unicode版本中是16位类型.
问题2
Char是一种序数类型,所以你可以写if s[i]<#21
.
您还需要为字符串启动循环,因为它们使用基于1的索引.
问题3
不需要写#0013,#13很好.
简而言之,几乎所有编写良好的代码都不需要更改.