public final class Normalizer
extends Object
implements Cloneable
java.lang.Object | |
↳ | android.icu.text.Normalizer |
旧的Unicode规范化API。
此API已被Normalizer2
类取代,仅可用于向后兼容。 这个类只是委托给Normalizer2类。 有两个例外:新API不提供QuickCheckResult
和compare()
的替代。
normalize
将Unicode文本转换为等效的组合或分解形式,从而可以更轻松地排序和搜索文本。 normalize
支持Unicode Standard Annex #15 — Unicode Normalization Forms中描述的标准规范化表单。
带有口音或其他装饰的字符可以用几种不同的Unicode编码方式进行编码。 例如,采取字符A-急性。 在Unicode中,这可以编码为单个字符(“合成”形式):
00C1 LATIN CAPITAL LETTER A WITH ACUTEor as two separate characters (the "decomposed" form):
0041 LATIN CAPITAL LETTER A 0301 COMBINING ACUTE ACCENT
但是,对于您的程序的用户,这两个序列应该被视为相同的“用户级”字符“A with accent accent”。 在搜索或比较文本时,必须确保这两个序列的处理方式相同。 另外,您必须处理多个口音的字符。 有时候,一个字符的合成口音的顺序是有意义的,而在其他情况下,不同顺序的口音顺序是非常相同的。
类似地,字符串“ffi”可以被编码为三个单独的字母:
0066 LATIN SMALL LETTER F 0066 LATIN SMALL LETTER F 0069 LATIN SMALL LETTER Ior as the single character
FB03 LATIN SMALL LIGATURE FFI
ffi连字符不是一个明显的语义字符,严格来说,它不应该是Unicode,但它包含在与现有字符集已经提供的兼容性中。 Unicode标准通过将“兼容性”分解赋予相应的语义字符来识别这些字符。 在排序和搜索时,您经常会想要使用这些映射。
normalize
通过将文本转换为上面第一个示例中所示的规范组合和分解形式normalize
帮助解决这些问题。 另外,您可以让它执行兼容性分解,以便可以将兼容性字符视为与其等效项相同。 最后, normalize
口音重新排列为正确的规范顺序,以便您不必担心自己的重音重排。
Form FCD,“Fast C or D”,也用于整理。 它允许使用在“规范封闭”下工作的算法(如归类)中未必标准化的字符串,也就是说,它将预分解字符及其分解的等价物视为相同。
这不是一种规范化形式,因为它不提供表示的唯一性。 多个字符串可能是正常等价的(它们的NFD是相同的),并且可能全都符合FCD,而本身不相同。
表单被定义为使得“原始分解”(即每个字符的递归规范分解)产生了规范排序的字符串。 这意味着只要分解后的字符不需要规范的重新排序,就可以使用预先构成的字符。
它对整理过程的优势在于,所有NFD和大多数NFC文本(以及许多非标准化文本)已经符合FCD,并且不需要针对此过程进行归一化(NFD)。 在实践中,FCD快速检查对大多数琴弦都会返回YES。
规范化(FCD)可以用NFD来实现。
有关FCD的更多详细信息,请参阅Unicode技术说明#5(应用程序中的规范等效):http://www.unicode.org/notes/tn5/#FCD
如果针对整理器对象启用了标准化,则ICU归类会自动执行NFD或FCD归一化。 除了排序和字符串搜索之外,规范化的字符串可能对字符串等同性比较,音译/转录,唯一表示等有用。
W3C通常建议在NFC中交换文本。 还要注意,大多数遗留字符编码仅使用预先组合的表格,并且通常不会自己编码任何组合标记。 为了转换为这种字符编码,需要将Unicode文本标准化为NFC。 有关更多用法示例,请参阅Unicode标准附录。
注意:Normalizer类还提供了用于迭代规范化的API。 虽然setIndex()和getIndex()引用了底层Unicode输入文本中的索引,但next()和previous()方法遍历规范化输出中的字符。 这意味着next()和previous()返回的字符与传递给setIndex()和getIndex()的索引之间不一定是一一对应的。 正是因为这个原因,Normalizer没有实现CharacterIterator接口。
Nested classes |
|
---|---|
class |
Normalizer.QuickCheckResult quickCheck()的结果值。 |
Constants |
|
---|---|
int |
COMPARE_CODE_POINT_ORDER 用于比较的选项位:以代码点顺序比较字符串,而不是代码单元顺序。 |
int |
COMPARE_IGNORE_CASE 用于比较的选项位:执行不区分大小写的比较。 |
int |
FOLD_CASE_DEFAULT 用于比较的选项位:区分大小写比较字符串 |
int |
FOLD_CASE_EXCLUDE_SPECIAL_I 案例折叠的选项值:使用CaseFolding.txt中提供的修改的映射集来处理适用于突厥语(tr,az)的点I和无点I。 |
int |
INPUT_IS_FCD 用于比较的选项位:假定两个输入字符串都满足FCD条件。 |
Fields |
|
---|---|
public static final Normalizer.QuickCheckResult |
MAYBE 表示无法进一步彻底检查字符串是否处于标准化格式。 |
public static final Normalizer.QuickCheckResult |
NO 表示该字符串不是标准化格式 |
public static final Normalizer.QuickCheckResult |
YES 表示该字符串处于规范化格式 |
Public methods |
|
---|---|
static int |
compare(char[] s1, char[] s2, int options) 比较两个字符串的规范等价。 |
static int |
compare(char[] s1, int s1Start, int s1Limit, char[] s2, int s2Start, int s2Limit, int options) 比较两个字符串的规范等价。 |
static int |
compare(int char32a, int char32b, int options) 通过不分配缓冲区可以更快实现的便捷方法。 |
static int |
compare(String s1, String s2, int options) 比较两个字符串的规范等价。 |
static int |
compare(int char32a, String str2, int options) 通过不分配缓冲区可以更快实现的便捷方法。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
int COMPARE_CODE_POINT_ORDER
用于比较的选项位:以代码点顺序比较字符串,而不是代码单元顺序。
常量值:32768(0x00008000)
int COMPARE_IGNORE_CASE
用于比较的选项位:执行不区分大小写的比较。
常量值:65536(0x00010000)
int FOLD_CASE_EXCLUDE_SPECIAL_I
案例折叠的选项值:使用CaseFolding.txt中提供的修改的映射集来处理适用于突厥语(tr,az)的点I和无点I。
也可以看看:
常数值:1(0x00000001)
int INPUT_IS_FCD
用于比较的选项位:假定两个输入字符串都满足FCD条件。
常量值:131072(0x00020000)
int compare (char[] s1, char[] s2, int options)
比较两个字符串的规范等价。 其他选项包括不区分大小写的比较和代码点顺序(与代码单元顺序相反)。 便利的方法。
Parameters | |
---|---|
s1 |
char : First source string. |
s2 |
char : Second source string. |
options |
int : A bit set of options: - FOLD_CASE_DEFAULT or 0 is used for default options: Case-sensitive comparison in code unit order, and the input strings are quick-checked for FCD. - INPUT_IS_FCD Set if the caller knows that both s1 and s2 fulfill the FCD conditions. If not set, the function will quickCheck for FCD and normalize if necessary. - COMPARE_CODE_POINT_ORDER Set to choose code point order instead of code unit order - COMPARE_IGNORE_CASE Set to compare strings case-insensitively using case folding, instead of case-sensitively. If set, then the following case folding options are used. |
Returns | |
---|---|
int |
<0 or 0 or >0 as usual for string comparisons |
也可以看看:
int compare (char[] s1, int s1Start, int s1Limit, char[] s2, int s2Start, int s2Limit, int options)
比较两个字符串的规范等价。 其他选项包括不区分大小写的比较和代码点顺序(与代码单元顺序相反)。 两个字符串之间的规范等同性被定义为它们的规范化形式(NFD或NFC)是相同的。 此函数递增比较字符串,而不是对两个字符串进行标准化(和可选的情况折叠),从而显着提高性能。 仅当字符串不符合FCD条件时才需要批量标准化。 只有在这种情况下,并且只有当字符串相对较长时,才会临时分配内存。 对于FCD字符串和短的非FCD字符串,不存在内存分配。 在语义上,这相当于strcmp [CodePointOrder](foldCase(NFD(s1)),foldCase(NFD(s2))),其中代码点顺序和foldCase都是可选的。
Parameters | |
---|---|
s1 |
char : First source character array. |
s1Start |
int : start index of source |
s1Limit |
int : limit of the source |
s2 |
char : Second source character array. |
s2Start |
int : start index of the source |
s2Limit |
int : limit of the source |
options |
int : A bit set of options: - FOLD_CASE_DEFAULT or 0 is used for default options: Case-sensitive comparison in code unit order, and the input strings are quick-checked for FCD. - INPUT_IS_FCD Set if the caller knows that both s1 and s2 fulfill the FCD conditions.If not set, the function will quickCheck for FCD and normalize if necessary. - COMPARE_CODE_POINT_ORDER Set to choose code point order instead of code unit order - COMPARE_IGNORE_CASE Set to compare strings case-insensitively using case folding, instead of case-sensitively. If set, then the following case folding options are used. |
Returns | |
---|---|
int |
<0 or 0 or >0 as usual for string comparisons |
也可以看看:
int compare (int char32a, int char32b, int options)
通过不分配缓冲区可以更快实现的便捷方法。
Parameters | |
---|---|
char32a |
int : the first code point to be checked against the |
char32b |
int : the second code point |
options |
int : A bit set of options |
Returns | |
---|---|
int |
int compare (String s1, String s2, int options)
比较两个字符串的规范等价。 其他选项包括不区分大小写的比较和代码点顺序(与代码单元顺序相反)。 两个字符串之间的规范等同性被定义为它们的规范化形式(NFD或NFC)是相同的。 此函数递增比较字符串,而不是对两个字符串进行标准化(和可选的情况折叠),从而显着提高性能。 仅当字符串不符合FCD条件时才需要批量标准化。 只有在这种情况下,并且只有当字符串相对较长时,才会临时分配内存。 对于FCD字符串和短的非FCD字符串,不存在内存分配。 在语义上,这相当于strcmp [CodePointOrder](foldCase(NFD(s1)),foldCase(NFD(s2))),其中代码点顺序和foldCase都是可选的。
Parameters | |
---|---|
s1 |
String : First source string. |
s2 |
String : Second source string. |
options |
int : A bit set of options: - FOLD_CASE_DEFAULT or 0 is used for default options: Case-sensitive comparison in code unit order, and the input strings are quick-checked for FCD. - INPUT_IS_FCD Set if the caller knows that both s1 and s2 fulfill the FCD conditions. If not set, the function will quickCheck for FCD and normalize if necessary. - COMPARE_CODE_POINT_ORDER Set to choose code point order instead of code unit order - COMPARE_IGNORE_CASE Set to compare strings case-insensitively using case folding, instead of case-sensitively. If set, then the following case folding options are used. |
Returns | |
---|---|
int |
<0 or 0 or >0 as usual for string comparisons |
也可以看看:
int compare (int char32a, String str2, int options)
通过不分配缓冲区可以更快实现的便捷方法。
Parameters | |
---|---|
char32a |
int : the first code point to be checked against |
str2 |
String : the second string |
options |
int : A bit set of options |
Returns | |
---|---|
int |