这听起来像个笑话,但我可以证明这一点.
假设:
s且仅当它匹配时才匹配s.toUpperCase().以下所有内容都非常符合逻辑并且在Java中保留:
"?".matches(".") LATIN SMALL LIGATURE FFI(U + FB03)是一个字符,因此它必须匹配"ß".matches(".") LATIN SMALL LETTER SHARP S(U + 00DF)是一个字符,因此它必须匹配"?".toUpperCase().equals("FFI") 按Unicode标准(没有资本连字FFI)"ß".toUpperCase().equals("SS") 按照Unicode标准(有一个大写的S,但它没有被使用)"FfI".toUpperCase().equals("FFI") 明显"sS".toUpperCase.equals("SS") 明显因此,假设正则表达式中的第一个点代表?第二个点,则正则ß表达式必须匹配"FFISS",并且因为不区分大小写也是"FfIsS".
我真的希望有一些错误,否则正则表达式会变得非常不可用.
问题:
我试图让case折叠在三种语言(C++,Python和Golang)之间保持一致,因为我需要能够检查字符串是否与保存的字符串相匹配.
一个有问题的例子是德语单词"grüßen",大写字母是"GRÜSSEN"(注意''''变成两个字符'SS').
有没有办法做到这一点我缺少,或者unicode文档末尾的这个bug是否适用于golang文本转换的所有用法?如果是这样的话,除了在cgo中编写之外,我有什么选择案例折叠?
我正在尝试实现一个库来读取Microsoft CFB(复合文件二进制)格式文件,根据该格式的官方规范.该规范可从该站点获得.
简而言之 - 文件的某些结构存储在一个红黑树中.我在用于在该树中存储这些结构的比较谓词时遇到问题.规范说,如果这些结构的名称(字符串存储为UTF-16,Windows API中的标准)不同,则必须遍历每个UTF-16代码点,并且:
(...)使用Unicode默认大小写转换算法,简单大小写转换变体(简单大小写折叠)转换为大写,并带有以下注释.<2>比较每个大写的UTF-16代码点二进制值.
该<2>基准说:
或Windows XP和Windows Server 2003:复合文件实现符合Unicode 3.0.1默认大小写转换算法,简单案例折叠(http://www.unicode.org/Public/3.1-Update1/CaseFolding-4.txt)除以下例外.
然而,当我查阅引用的案例折叠文件,并阅读那里引用的UTR#21"案例映射"时,我意识到案例折叠被定义为一种与下套管更相似的操作,而不是上部 -套管.
通过使用CaseFolding-4.txt,我们可以获得大写字母到小写字母的大小写折叠映射.映射始终为1对1,因为此处不需要完全折叠(扩展为多个字符的折叠).但是,小写字母到大写字母的反向映射不再是直截了当的.例如,
0392; C; 03B2; # GREEK CAPITAL LETTER BETA
03D0; C; 03B2; # GREEK BETA SYMBOL
Run Code Online (Sandbox Code Playgroud)
因此,我们无法知道是否03B2应转换为0392或03D0.标准是否定义了折叠成大写的东西?也许我应该使用case折叠,然后转换为大写?或者我完全错误地理解了规范?
我有一个问题,用变音符号将大写字母转换为小写字母.
print("ÄÖÜAOU".lower())
Run Code Online (Sandbox Code Playgroud)
A,O和U可以正确转换,但Ä,Ö和Ü保持大写.有任何想法吗?
第一个问题是使用.decode('utf-8')修复的,但我仍然有第二个问题:
# -*- coding: utf-8 -*-
original_message="ÄÜ".decode('utf-8')
original_message=original_message.lower()
original_message=original_message.replace("ä", "x")
print(original_message)
Run Code Online (Sandbox Code Playgroud)
回溯(最近一次调用最后一次):文件"Untitled.py",第4行,在original_message = original_message.replace("ä","x")UnicodeDecodeError:'ascii'编解码器无法解码位置0的字节0xc3:序数不在范围内(128)
"strasse".Equals("STRAße",StringComparison.InvariantCultureIgnoreCase)
Run Code Online (Sandbox Code Playgroud)
这返回真。哪个是正确的。不幸的是,当我将其中一个存储在 postgres 中时,它认为在进行不区分大小写的匹配(例如, with ~*)时它们不一样。我也用 citext 测试过。
因此,一种解决方案是预先折叠案例,从而将strasse这些值中的任何一个存储在另一列中。然后我可以索引并搜索匹配项。
我一直在寻找如何在 C# 中折叠 case 一段时间,但一直无法在 C# 中找到解决方案。显然,知识是存在的,因为它可以正确比较这些字符串,我只是找不到从哪里获取它。
一种解决方案是生成一个 perl 进程perl -E "binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while (<>) { print fc }",将进程的 C# 端也设置为这些管道的 utf8,然后通过 perl 发送文本以折叠案例。但必须有比这更好的方法。
要不区分大小写地比较两个字符串,一种正确的方法是先将它们大小写折叠。这比上壳或下壳好在哪里?
我找到了一些示例,其中小写字母在网上无法正常工作。例如 ”?” 和 ”?” (两种形式的“?”)在转换为小写时不会变得相同。但是我没有找到为什么大小写折叠比映射到大写更好。是否存在应该不区分大小写匹配的两个字符串不大写到相同字符串的情况?
另一种情况是当我想存储不区分大小写的索引时。推荐的方式似乎是大小写折叠然后归一化。与存储映射到大写和规范化的字符串相比,它有什么优势?规范说映射到大写不能保证跨 Unicode 版本稳定,而大小写折叠是。但是在早期版本的 Unicode 中,是否存在映射到大写会给出不同字符串的情况?
vowels = 'aeiou'
# take input from the user
ip_str = raw_input("Enter a string: ")
# make it suitable for caseless comparisions
ip_str = ip_str.casefold()
# make a dictionary with each vowel a key and value 0
count = {}.fromkeys(vowels,0)
# count the vowels
for char in ip_str:
if char in count:
count[char] += 1
print(count)
Run Code Online (Sandbox Code Playgroud)
错误:
Line - ip_str = ip_str.casefold()
AttributeError: 'str' object has no attribute 'casefold'
Run Code Online (Sandbox Code Playgroud) 最近在忽略案例时阅读了案例折叠和字符串比较.我已经读过,MSDN标准是使用InvariantCulture,绝对避免使用toLowercase.然而,我所读到的案例翻译就像是一个更具攻击性的低级版.我的问题是我应该在Python中使用casefold还是使用更多的pythonic标准?案件折叠是否通过土耳其测试?
case-folding ×8
unicode ×5
python ×3
c# ×1
diacritics ×1
go ×1
java ×1
lowercase ×1
python-2.6 ×1
python-3.x ×1
regex ×1
utf-16 ×1