1# 字符处理
2
3## 使用场景
4
5不同语言中字符规则差异较大,通常很难从对应文本中提取需要的信息。通过字符处理,可以在不同语言规则下,以相似的逻辑处理文本。
6
7## 开发步骤
8
9
10### 字符属性
11
12字符属性用于判断字符类别,如判断字符是否为数字、字母、空格,是否为从右到左语言的字符,是否为表意文字(主要是中文日文韩文)等。
13
14该功能通过Unicode类的[isDigit](../reference/apis-localization-kit/js-apis-i18n.md#isdigit9)等接口实现,具体开发步骤如下。
15
161. 导入模块。
17
18   ```ts
19   import { i18n } from '@kit.LocalizationKit';
20   ```
21
222. 判断字符属性。
23
24   ```ts
25   let isDigit: boolean = i18n.Unicode.isDigit(char: string);
26   ```
27
283. 以一般类别值为例,判断字符类类型,具体请参考getType接口文档。
29
30   ```ts
31   let type = i18n.Unicode.getType(char: string);
32   ```
33
34**开发实例**
35```ts
36// 导入模块
37import { i18n } from '@kit.LocalizationKit';
38
39// 判断字符是否是数字
40let isDigit = i18n.Unicode.isDigit('1'); // isDigit: true
41
42// 判断字符是否是从右到左语言的字符
43let isRTL = i18n.Unicode.isRTL('a'); // isRTL: false
44
45// 判断字符是否是表意文字
46let isIdeograph = i18n.Unicode.isIdeograph('华'); // isIdeograph: true
47
48// 获取字符的一般类别值
49let type = i18n.Unicode.getType('a'); // type: U_LOWERCASE_LETTER
50```
51
52
53### 音译
54
55音译是指以当地语言发音相近的内容替换原本的内容。通过Transliterator类的[transform](../reference/apis-localization-kit/js-apis-i18n.md#transform9)接口实现,具体开发步骤如下。
56
57> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
58> 本模块支持中文汉字转为拼音,但对于多音字无法根据上下文语义有效处理。
59
601. 导入模块。
61   ```ts
62   import { i18n } from '@kit.LocalizationKit';
63   ```
64
652. 创建Transliterator对象,获取音译列表。
66   ```ts
67   let transliterator: i18n.Transliterator = i18n.Transliterator.getInstance(id: string);  // 传入音译支持的ID,创建Transliterator对象
68   let ids: string[] = i18n.Transliterator.getAvailableIDs();  // 获取音译支持的ID列表
69   ```
70
713. 音译文本。
72   ```ts
73   let res: string = transliterator.transform(text: string);  // 对text内容进行音译
74   ```
75
76
77**开发实例**
78```ts
79// 导入模块
80import { i18n } from '@kit.LocalizationKit';
81
82// 音译成Latn格式
83let transliterator = i18n.Transliterator.getInstance('Any-Latn');
84let wordArray = ["中国", "德国", "美国", "法国"]
85for (let i = 0; i < wordArray.length; i++) {
86    let res = transliterator.transform(wordArray[i]); // res: zhōng guó, dé guó, měi guó, fǎ guó
87}
88
89// 汉语音译去声调
90let transliter = i18n.Transliterator.getInstance('Any-Latn;Latin-Ascii');
91let result = transliter.transform('中国'); // result: zhong guo
92
93// 汉语姓氏读音
94let nameTransliter = i18n.Transliterator.getInstance('Han-Latin/Names');
95let result1 = nameTransliter.transform('单老师'); // result1: shàn lǎo shī
96let result2 = nameTransliter.transform('长孙无忌'); // result2: zhǎng sūn wú jì
97
98
99// 获取音译支持的ID列表
100let ids = i18n.Transliterator.getAvailableIDs(); // ids: ['ASCII-Latin', 'Accents-Any', ...]
101```
102
103
104### 字符标准化
105
106字符标准化是指按指定的范式标准化字符。通过Normalizer类的[normalize](../reference/apis-localization-kit/js-apis-i18n.md#normalize10)接口实现,具体开发步骤如下。
107
1081. 导入模块。
109   ```ts
110   import { i18n } from '@kit.LocalizationKit';
111   ```
112
1132. 创建标准化对象。传入文本标准化的范式,创建标准化对象,文本标准化的范式包括NFC、NFD、NFKC和NFKD,范式的详细介绍请参考[国际标准](https://www.unicode.org/reports/tr15/#Norm_Forms)114   ```ts
115   let normalizer: i18n.Normalizer = i18n.Normalizer.getInstance(mode: NormalizerMode);
116   ```
117
1183. 文本标准化。
119   ```ts
120   let normalizedText: string = normalizer.normalize(text: string); // 对text文本进行标准化
121   ```
122
123**开发实例**
124```ts
125// 导入模块
126import { i18n } from '@kit.LocalizationKit';
127
128// 以NFC范式标准化字符
129let normalizer = i18n.Normalizer.getInstance(i18n.NormalizerMode.NFC);
130let normalizedText = normalizer.normalize('\u1E9B\u0323'); // normalizedText: \u1E9B\u0323
131```
132
133
134### 断词换行
135
136断词换行是指根据设定的区域参数获取文本中的分割点,通过[BreakIterator](../reference/apis-localization-kit/js-apis-i18n.md#breakiterator8)类的接口实现,具体开发步骤如下。
137
1381. 导入模块。
139   ```ts
140   import { i18n } from '@kit.LocalizationKit';
141   ```
142
1432. 创建用于断句的对象。
144   传入合法的locale参数,生成BreakIterator类型的对象,该对象将按照locale所指定的区域的规则进行断句。
145
146   ```ts
147   let iterator: i18n.BreakIterator = i18n.getLineInstance(locale: string);
148   ```
149
1503. 设置要处理的文本。
151   ```ts
152   iterator.setLineBreakText(text: string); // 设置要处理的文本
153   let breakText: string = iterator.getLineBreakText(); // 查看iterator正在处理的文本
154   ```
155
1564. 获取可断句的位置。
157   ```ts
158   let currentPos: number = iterator.current(); // 获取iterator在当前所处理文本中的位置
159   let firstPos: number = iterator.first(); // 设置为第一个可断句的分割点,返回该分割点的位置。第一个分割点总是在文本的起始位置,firstPos = 0
160   let nextPos: number = iterator.next(number); // 将iterator移动number数量个分割点,number为正数代表向后移动,number为负数代表向前移动,默认值为1。nextPos为移动后在文本中的位置,如果超出文本的长度范围,返回-1
161   let isBoundary: boolean = iterator.isBoundary(number); // 判断number位置是否是分割点
162   ```
163
164
165**开发实例**
166```ts
167// 导入模块
168import { i18n } from '@kit.LocalizationKit';
169
170// 断句对象
171let iterator = i18n.getLineInstance('en-GB');
172
173// 断句文本
174iterator.setLineBreakText('Apple is my favorite fruit.');
175
176// 将BreakIterator对象移动到文本起始位置
177let firstPos = iterator.first(); // firstPos: 0
178
179// 将BreakIterator对象移动几个分割点
180let nextPos = iterator.next(2); // nextPos: 9
181
182// 判断某个位置是否是分割点
183let isBoundary = iterator.isBoundary(9); // isBoundary: true
184
185// 获取BreakIterator对象处理的文本
186let breakText = iterator.getLineBreakText(); // breakText: Apple is my favorite fruit.
187```
188<!--RP1--><!--RP1End-->