不区分大小写的存储和Unicode兼容性 [英] Case-insensitive storage and unicode compatibility

查看:13
本文介绍了不区分大小写的存储和Unicode兼容性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

听说我的工作中有人使用String.toLowerCase()将不区分大小写的代码存储在数据库中以供搜索,我有epic fail的时间思考它可能出错的方式:

  • 土耳其测试(特别是在运行的计算机上更改区域设置)
  • Unicode version upgrades-我的意思是,谁知道这些东西?如果我升级到Java 7,如果我不区分大小写,我必须重新索引我的数据?

Unicode版本会影响哪些技术?

我是否需要担心Oracle或SQL Server(或其他供应商)更改其Unicode版本并导致我的某个区域设置不会导致相同的小写或大写字符转换?

我如何管理这一点?我被确保使用数据库转换的"简单性"所吸引,但当进行升级时,也会出现同样的问题。

推荐答案

您不想存储字符串的小写版本以供搜索!!

这是完全错误的方法。您对Unicode大小写的工作方式做出了不公正和不正确的假设。

这就是为什么Unicode为字符串定义了一个单独的东西,称为大小写,区别于三种不同的大小写(小写、大小写和大写)。

以下是十个不同的示例如果您使用小写而不是大小写:

,您将会做错误的事情
ORIGINAL        CASEFOLD        LOWERCASE   TITLECASE  UPPERCASE
========================================================================
efficient         efficient       efficient       Efficient         EFFICIENT       
flour            flour           flour           Flour           FLOUR           
poſt            post            poſt           Poſt            POST            
poſt             post            poſt             Poſt            POST            
ſtop             stop            ſtop            Stop            STOP            
tschüß          tschüss         tschüß         Tschüß         TSCHÜSS         
weiß            weiss           weiß           Weiß            WEISS           
WEIẞ            weiss           weiß            Weiß           WEIẞ            
στιγμας         στιγμασ         στιγμας         Στιγμας         ΣΤΙΓΜΑΣ 
ᾲ στο διάολο    ὰι στο διάολο   ᾲ στο διάολο    Ὰͅ Στο Διάολο   ᾺΙ ΣΤΟ ΔΙΆΟΛΟ        
是的,我知道污点的复数是污点,而不是污点;我试图展示最后的西格玛问题。ς和σ都是大写字母sigmaΣ的有效小写形式。如果你只存储"小写字母",那么你就会得到错误的东西。

如果您使用的是Java的Pattern类,则必须同时指定CASE_INSENSITIVEUNICODE_CASE,但您仍然不会正确地使用它们,因为虽然Java使用完整的案例映射,但它只使用简单的案例折叠。这是一个问题。

至于突厥语,是的,突厥语确实有一个特殊的案例。例如,İ标准有一个突厥语案例,其中只有ı̇标准,而不是您应该得到的İ标准。因为我确定这些不会让您觉得对,所以我将用非ASCII的命名字符来说明它;更简单地说,"N{LATIN CAPITAL LETTER I WITH DOT ABOVE}stanbul"有一个突厥语案例折叠"N{LATIN SMALL LETTER DOTLESS I}N{COMBINING DOT ABOVE}stanbul",而不是您通常得到的"iN{COMBINING DOT ABOVE}stanbul"

如果您正在编写回归测试套件,下面还有几个表行:

[ "Henry Ⅷ", "henry ⅷ", "henry ⅷ", "Henry Ⅷ", "HENRY Ⅷ",  ],
[ "I Work At Ⓚ",  "i work at ⓚ",  "i work at ⓚ", "I Work At Ⓚ", "I WORK AT Ⓚ", ],
[ "ʀᴀʀᴇ", "ʀᴀʀᴇ", "ʀᴀʀᴇ", "Ʀᴀʀᴇ", "ƦᴀƦᴇ",  ],
[ "Ԧԧ", "ԧԧ", "ԧԧ", "Ԧԧ", "ԦԦ",   ],
[ "𐐼𐐯𐑅𐐨𐑉𐐯𐐻", "𐐼𐐯𐑅𐐨𐑉𐐯𐐻", "𐐼𐐯𐑅𐐨𐑉𐐯𐐻", "𐐔𐐯𐑅𐐨𐑉𐐯𐐻", "𐐔𐐇𐐝𐐀𐐡𐐇𐐓",   ],
[ "Ὰͅ", "ὰι", "ᾲ", "Ὰͅ", "ᾺΙ",  ],
其中每一列都是orig、old、lc、tc和uc,就像我在上面的表中所做的那样。再次注意最后一行的大小写是如何不同的。

这篇关于不区分大小写的存储和Unicode兼容性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆