0

那里有任何宽字符串操作实现吗?

function WideUpperCase(const S: WideString): WideString;

function WidePos(Substr: WideString; S: WideString): Integer;

function StringReplaceW(const S, OldPattern, NewPattern: WideString; 
      Flags: TReplaceFlags): WideString;

etc
4

3 回答 3

4

JEDI 项目包括JclUnicode.pas,它有 WideUpperCase 和 WidePos,但没有 StringReplace。SysUtils.pas StringReplace 代码不是很复杂,因此您可以轻松地复制它并用 WideString 替换字符串,用 WidePos 替换 AnsiPos,用 WideUpperCase 替换 AnsiUpperCase 并获得一些功能,如果慢的话。

于 2010-04-05T21:43:15.030 回答
2

我一般导入“Microsoft VBScript Regular Expression 5.5”类型库并使用 IRegExp 对象。

OP 编辑

我喜欢这个答案,然后我继续StringReplaceW使用 RegEx 编写了一个函数:

function StringReplaceW(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags): WideString;
var
    objRegExp: OleVariant;
    Pattern: WideString;
    i: Integer;
begin
    {
        Convert the OldPattern string into a series of unicode points to match
        \uxxxx\uxxxx\uxxxx

            \uxxxx  Matches the ASCII character expressed by the UNICODE xxxx.
                        "\u00A3" matches "£".
    }
    Pattern := '';
    for i := 1 to Length(OldPattern) do
        Pattern := Pattern+'\u'+IntToHex(Ord(OldPattern[i]), 4);

    objRegExp := CreateOleObject('VBScript.RegExp');
    try
        objRegExp.Pattern := Pattern;
        objRegExp.IgnoreCase := (rfIgnoreCase in Flags);
        objRegExp.Global := (rfReplaceAll in Flags);

        Result := objRegExp.Replace(S, NewPattern);
    finally
        objRegExp := Null;
    end;
end;
于 2010-04-06T06:07:33.227 回答
2

TntControls 有一组 Wide-version 函数。

于 2010-04-06T03:26:34.963 回答