gpt4 book ai didi

windows - 是否可以为 Windows 7 和/或 8 创建不区分大小写的自定义区域设置?

转载 作者:可可西里 更新时间:2023-11-01 10:24:51 26 4
gpt4 key购买 nike

<分区>

动机:我想在 PostgreSQL 中以不区分大小写的方式处理字符串。我知道 CITEXT 数据类型,我也知道我可以在其中使用 LOWER 函数的功能索引。

不过,最有效的解决方案似乎是使用不区分大小写的排序规则——这在 Sql Server 中是微不足道的。无论如何,PostgreSQL 似乎无法定义自己的自定义排序规则,而是从操作系统中找到的语言环境派生它们,即在我的例子中是 Windows。

那么,问题是 - 是否可以创建一个自定义的 Windows 语言环境,以不区分大小写的方式处理字符?

我能得到的最远的是安装一个 locale builder并将 en-US 区域设置导出到相应的 XML 表示(称为 LDML)以查看其中的内容。寻找 sort 关键字返回这两行:

  <msLocale:sortName type="en-US" />
<msLocale:sortGuid type="{00000001-57EE-1E5C-00B4-D0000BB1E11E}" />

可以在 Windows 注册表中找到 guid:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Sorting\Ids]
@="{00000001-57EE-1E5C-00B4-D0000BB1E11E}"
"mn-Mong"="{00000001-57EE-1E5C-00B4-D0000BB1E11E}"

(key下还有更多的字符串值)

这不会导致任何结果。我并不比以前更接近不区分大小写的自定义语言环境。

有可能 LDML 可用于描述不区分大小写的语言环境,但我不知道如何构建它。

编辑

深思:

SQL 服务器:

SELECT 'Latin1_General_CS_AS' AS 'Collation',
COLLATIONPROPERTY('Latin1_General_CS_AS', 'CodePage') AS 'CodePage',
COLLATIONPROPERTY('Latin1_General_CS_AS', 'LCID') AS 'LCID',
CONVERT(VARBINARY(8), COLLATIONPROPERTY('Latin1_General_CS_AS', 'ComparisonStyle')) AS 'ComparisonStyle',
COLLATIONPROPERTY('Latin1_General_CS_AS', 'Version') AS 'Version'
UNION ALL
SELECT 'Latin1_General_CI_AS' AS 'Collation',
COLLATIONPROPERTY('Latin1_General_CI_AS', 'CodePage') AS 'CodePage',
COLLATIONPROPERTY('Latin1_General_CI_AS', 'LCID') AS 'LCID',
CONVERT(VARBINARY(8), COLLATIONPROPERTY('Latin1_General_CI_AS', 'ComparisonStyle')) AS 'ComparisonStyle',
COLLATIONPROPERTY('Latin1_General_CI_AS', 'Version') AS 'Version'

产量

Collation               CodePage    LCID    ComparisonStyle Version
Latin1_General_CS_AS 1252 1033 0x00030000 0
Latin1_General_CI_AS 1252 1033 0x00030001 0

Win32 API:

CompareStringEx Win32 function :

int CompareStringEx(
_In_opt_ LPCWSTR lpLocaleName,
_In_ DWORD dwCmpFlags,
_In_ LPCWSTR lpString1,
_In_ int cchCount1,
_In_ LPCWSTR lpString2,
_In_ int cchCount2,
_In_opt_ LPNLSVERSIONINFO lpVersionInformation,
_In_opt_ LPVOID lpReserved,
_In_opt_ LPARAM lParam
);

dwCmpFlags 参数的标志可以在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\WinNls.h 中找到:

//
// String Flags.
//
#define NORM_IGNORECASE 0x00000001 // ignore case
#define NORM_IGNORENONSPACE 0x00000002 // ignore nonspacing chars
#define NORM_IGNORESYMBOLS 0x00000004 // ignore symbols

#define LINGUISTIC_IGNORECASE 0x00000010 // linguistically appropriate 'ignore case'
#define LINGUISTIC_IGNOREDIACRITIC 0x00000020 // linguistically appropriate 'ignore nonspace'

#define NORM_IGNOREKANATYPE 0x00010000 // ignore kanatype
#define NORM_IGNOREWIDTH 0x00020000 // ignore width
#define NORM_LINGUISTIC_CASING 0x08000000 // use linguistic rules for casing

由此我得出结论:

  • 使用 Latin1_General_CS_AS 导致使用标志 NORM_IGNOREKANATYPE|NORM_IGNOREWIDTH 调用 CompareStringEx
  • 使用 Latin1_General_CI_AS 导致 CompareStringEx 被调用并带有标志 NORM_IGNOREKANATYPE|NORM_IGNOREWIDTH|NORM_IGNORECASE

但下一步是什么?如何创建自己的 Windows 区域设置,类似于 Latin1_General_CI_AS,但可在 SQL Server 外部使用?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com