You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PathMatchSpec/PathMatchSpecEx函数韩语环境匹配异常问题求助

解决PathMatchSpec/PathMatchSpecEx在韩语Windows环境下的匹配错误问题

问题现象

在英文、德语Windows系统中,PathMatchSpec()和PathMatchSpecEx()函数可正常匹配韩语文件名(如“수납파일”)与掩码“수납*”,但在韩语Windows系统中两个函数均返回匹配失败。测试环境为Windows 10/11、Delphi 10.4.2。

问题根源

这两个函数默认的匹配逻辑依赖系统当前区域设置,对于韩语这类存在字符归一化差异的语言,区域设置会干扰字符串比较规则,导致通配符匹配失效。

解决方案

通过PathMatchSpecEx()的dwFlags参数,指定不依赖区域设置的二进制匹配规则,强制进行精确Unicode二进制匹配,即可在所有语言环境下正常工作。推荐组合使用PMSF_NOWILDCHARACTEREXPANSION和PMSF_NOUSERSETTINGS标志。

修改后的C++代码

#include <iostream>
#include <shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

int main()
{
    // 设置不受区域影响的二进制匹配标志
    const DWORD matchFlags = PMSF_NOWILDCHARACTEREXPANSION | PMSF_NOUSERSETTINGS;

    // 原PathMatchSpec无自定义匹配规则参数,建议替换为PathMatchSpecEx
    bool pathMatchResult = PathMatchSpec(L"수납파일", L"수납*");
    std::cout << "PathMatchSpec 结果: " << (pathMatchResult ? "成功" : "失败") << std::endl;

    HRESULT exResult = PathMatchSpecEx(L"수납파일", L"수납*", matchFlags);
    std::cout << "PathMatchSpecEx 结果: " << (exResult == S_OK ? "成功" : "失败") << std::endl;

    return 0;
}

修改后的Delphi代码

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, Winapi.ShLwApi,
  System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    Label3: TLabel;
    Button2: TButton;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    

const
  // 定义匹配标志常量
  PMSF_NOWILDCHARACTEREXPANSION = $00000001;
  PMSF_NOUSERSETTINGS = $00000002;

function PathMatchSpecEx(pszFile, pszSpec: LPCWSTR; dwFlags: DWORD ): HRESULT; stdcall;
{$EXTERNALSYM PathMatchSpecEx}

var
  Form1: TForm1;

implementation

{$R *.dfm}

function PathMatchSpecEx; external 'shlwapi.dll' name 'PathMatchSpecExW';    

procedure TForm1.FormCreate(Sender: TObject);
var fileName, fileMask: string;
begin
  fileName := '수납파일';
  fileMask:= '수납*';

  Edit1.Text := fileName;
  Edit2.Text := fileMask;   
end;   

procedure TForm1.Button1Click(Sender: TObject);
var fileName, fileMask: string;
    matchFlags: DWORD;
begin
  fileName := Edit1.Text;
  fileMask := Edit2.Text;

  // 启用二进制匹配规则
  matchFlags := PMSF_NOWILDCHARACTEREXPANSION or PMSF_NOUSERSETTINGS;

  if PathMatchSpecEx(PChar(fileName), PChar(fileMask), matchFlags) = S_OK then
     Label3.Caption := 'PathMatchSpecEx 成功!'
  else
     Label3.Caption := 'PathMatchSpecEx 失败!';
end;

procedure TForm1.Button2Click(Sender: TObject);
var fileName, fileMask: string;
begin
  fileName := Edit1.Text;
  fileMask := Edit2.Text;

  // PathMatchSpec无自定义匹配规则,建议改用带标志的PathMatchSpecEx
  if PathMatchSpec(PChar(fileName), PChar(fileMask)) then
     Label4.Caption := 'PathMatchSpec 成功!'
  else
     Label4.Caption := 'PathMatchSpec 失败!';
end;

end.

关键标志说明

  • *PMSF_NOUSERSETTINGS*:忽略系统用户的区域设置,采用默认二进制字符串比较
  • *PMSF_NOWILDCHARACTEREXPANSION*:关闭通配符的区域相关扩展,仅按字面通配符规则匹配
  • 由于PathMatchSpec()无法自定义匹配规则,建议统一替换为PathMatchSpecEx()带标志的调用方式,保证跨语言环境的一致性。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:45:34