德尔福里约。我用 Delphi 构建了一个 Excel 插件(也使用 AddIn Express)。我遍历一列以读取单元格值。在读取单元格值后,我执行了 TRIM 函数。TRIM 不会删除最后一个空格。代码片段...
acctName := Trim(UpperCase(Acctname));
Run Code Online (Sandbox Code Playgroud)
在代码之前,AcctName 是“ABC Holdings”。在 TRIM 功能之后也是一样的。Excel 似乎在那里添加了某种类型的其他字符。(新行??回车??)摆脱这种情况的最佳方法是什么?有没有办法让调试器向我显示这个变量的十六进制值。我试过 INSPECT 和 EVALUATE 窗口。他们都只显示文本。请注意,我必须小心删除非文本字符,并且一些公司名称有破折号、逗号、撇号等。
**附加信息 - 根据 Andreas 的建议,我添加了以下内容...
ShowMessage(IntToHex(Ord(Acctname[Acctname.Length])));
Run Code Online (Sandbox Code Playgroud)
这与'00A0'一起返回。所以我想我可以做一个简单的 StringReplace ......所以我在 Andreas 代码之前添加了这个......
acctName := StringReplace(acctName, #13, '', [rfReplaceAll]);
acctName := StringReplace(acctName, #10, '', [rfReplaceAll]);
Run Code Online (Sandbox Code Playgroud)
然而,似乎什么都没有改变。ShowMessage 仍然显示“00A0”作为最后一个字符。为什么 StringReplace 不删除它?
如果你想知道你的字符串最后一个字符的真实身份,你可以显示它的 Unicode 代码点:
ShowMessage(IntToHex(Ord(Acctname[Acctname.Length]))).
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用实用程序来调查剪贴板上的 Unicode 字符,例如我自己的.
是的,有问题的字符是U+00A0: NO-BREAK SPACE。
这就像一个通常的空间,但它告诉渲染应用程序不要在这个空间放置换行符。例如,至少在瑞典语中,您希望5 000 kWh.
默认情况下,Trim并且TStringHelper.Trim不移除这种空白的。(他们也离开了U+2007: FIGURE SPACE,还有一些其他类型的空白。)
字符串帮助器方法有一个重载,可让您指定要修剪的字符。您可以使用它来包括U+00A0:
S.Trim([#$20, #$A0, #$9, #$D, #$A]) // space, nbsp, tab, CR, LF
// (many whitespace characters missing!)
Run Code Online (Sandbox Code Playgroud)
但也许更好的解决方案是依靠 Unicode 特征并做
function RealTrimRight(const S: string): string;
var
i: Integer;
begin
i := S.Length;
while (i > 0) and S[i].IsWhiteSpace do
Dec(i);
Result := Copy(S, 1, i);
end;
Run Code Online (Sandbox Code Playgroud)
当然,你也可以实现类似RealTrimLeft和RealTrim功能。
当然,有很多方法可以在调试器中查看实际的字符串字节。除了Ord(S[S.Length])在Evaluate/Modify窗口 ( Ctrl+F7) 中写东西之外,我个人最喜欢的方法是使用Memory窗口 ( Ctrl+Alt+E)。当它具有焦点时,您可以按下Ctrl+G并键入S[1]以查看实际字节:
在这里您可以看到字符串test string。由于字符串是从 Delphi 2009 开始的 Unicode (UTF-16),因此每个字符占用两个字节。对于简单的 ASCII 字符,这意味着每隔一个字节为空。我们字符串的 ASCII 值是74 65 73 74 20 73 74 72 69 6E 67. 您还可以看到,在上面的 ( 02A0855C) 行中,我们的字符串对象具有引用计数1和长度B(=11)。
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |