为什么不是locale.strxfrm(“Gè”)的locale.strxfrm(“Gène”))前缀和语言环境“ fr_FR.UTF-8”?

问题描述 投票:3回答:1

这里的代码是Python中的,但是使用locale在C / C ++中的行为应相同。

>>> import locale
>>> locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
>>> locale.strxfrm("Gène").startswith(locale.strxfrm("Gè"))
False

我知道不应该这样使用,但是我想知道发生了什么...

上下文:我有一个由strxfrm转换的字符串数组和一个普通的输入文本。我想知道哪些strxfrm转换的字符串以文本before转换开头。完全可行吗?怎么样?

奖金问题:

我们可以获取每个地区的等价字母列表吗?我们可以检查等效的字符串吗?

我的意思是:在"de_DE.UTF8"中,我可以得到类似的东西吗?>

locale.strxfrm("Wissen").startswith(locale.strxfrm("Wiß")) 

返回True吗?

由于排序为"ß" and "ss" are equivalent(除非是唯一的区别):

> locale.strxfrm("Wiessen") < locale.strxfrm("Wießen") < locale.strxfrm("Wiessen0")
True

与法语中的“œ”和“ oe”相同。

EDIT

:关于红利,我看到了Python locale-aware string comparison,但答案依赖于第三方库,因此我提出了一种变通方法hacked function:
def isEquivalent(str1, str2):
    return ( locale.strxfrm(str2[:-1]) < locale.strxfrm(str1) <= locale.strxfrm(str2) < locale.strxfrm(str1+"0") 
    or 
    locale.strxfrm(str1[:-1]) < locale.strxfrm(str2) <= locale.strxfrm(str1) < locale.strxfrm(str2+"0") )

这里的代码在Python中,但是在使用区域设置的C / C ++中,行为应相同。 >>>导入语言环境>>> locale.setlocale(locale.LC_ALL,“ fr_FR.UTF-8”)>>>语言环境....

python string utf-8 comparison locale
1个回答
1
投票

一个非常有趣的问题!这个答案不是典型的,我认为glibc-dev将是最佳的论坛。

© www.soinside.com 2019 - 2024. All rights reserved.