• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 字符处理
2
3<!--Kit: Localization Kit-->
4<!--Subsystem: Global-->
5<!--Owner: @yliupy-->
6<!--Designer: @sunyaozu-->
7<!--Tester: @lpw_work-->
8<!--Adviser: @Brilliantry_Rui-->
9
10## 使用场景
11
12不同语言中字符规则差异较大,通常很难从对应文本中提取需要的信息。通过字符处理,可以在不同语言规则下,以相似的逻辑处理文本。
13
14## 开发步骤
15
16
17### 字符属性
18
19字符属性用于判断字符类别,如判断字符是否为数字、字母、空格,是否为从右到左语言的字符,是否为表意文字(主要是中文日文韩文)等。
20
21使用Unicode类的[isDigit](../reference/apis-localization-kit/js-apis-i18n.md#isdigit9)等接口可以实现该功能,具体开发步骤如下:
22
231. 导入模块。
24
25   ```ts
26   import { i18n } from '@kit.LocalizationKit';
27   ```
28
292. 判断字符属性。
30
31   ```ts
32   let isDigit: boolean = i18n.Unicode.isDigit(ch: string);
33   ```
34
353. 以一般类别值为例,获取字符类型。
36
37   ```ts
38   let unicodeType: string = i18n.Unicode.getType(ch: string);
39   ```
40
41**开发实例**
42```ts
43// 导入模块
44import { i18n } from '@kit.LocalizationKit';
45
46// 判断字符是否是数字
47let isDigit: boolean = i18n.Unicode.isDigit('1'); // isDigit = true
48
49// 判断字符是否是从右到左语言的字符
50let isRTL: boolean = i18n.Unicode.isRTL('a'); // isRTL = false
51
52// 判断字符是否是表意文字
53let isIdeograph: boolean = i18n.Unicode.isIdeograph('华'); // isIdeograph = true
54
55// 获取字符的一般类别值
56let unicodeType: string = i18n.Unicode.getType('a'); // unicodeType = 'U_LOWERCASE_LETTER'
57```
58
59
60### 音译
61
62音译是指将采用某个文字系统或字母表表示的文本转换为发音相同的采用另一个文字系统或字母表表示的文本的过程,并不等同于翻译。使用Transliterator类的[transform](../reference/apis-localization-kit/js-apis-i18n.md#transform9)接口可以实现音译功能,具体开发步骤如下:
63
64> **说明:**
65> 本模块支持中文汉字转拼音,但当中文文本中包含多音字时,可能出现部分多音字无法按照正确的发音转换为拼音的问题。
66
671. 导入模块。
68   ```ts
69   import { i18n } from '@kit.LocalizationKit';
70   ```
71
722. 获取音译支持的转换ID列表并创建Transliterator对象。
73   ```ts
74   let ids: string[] = i18n.Transliterator.getAvailableIDs(); // 获取音译支持的转换ID列表
75   let transliterator: i18n.Transliterator = i18n.Transliterator.getInstance(id: string); // 传入音译支持的转换ID,创建Transliterator对象
76   ```
77
783. 音译文本。
79   ```ts
80   let translatedText: string = transliterator.transform(text: string); // 对text内容进行音译
81   ```
82
83
84**开发实例**
85```ts
86// 导入模块
87import { i18n } from '@kit.LocalizationKit';
88
89// 音译成Latn格式
90let transliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Any-Latn');
91let text: string = '中国';
92let translatedText: string = transliterator.transform(text); // translatedText = 'zhōng guó'
93
94// 汉语音译去声调
95let toneLessTransliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Any-Latn;Latin-Ascii');
96translatedText = toneLessTransliterator.transform('中国'); // translatedText = 'zhong guo'
97
98// 汉语姓氏读音
99let nameTransliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Han-Latin/Names');
100translatedText = nameTransliterator.transform('单老师'); // translatedText = 'shàn lǎo shī'
101translatedText = nameTransliterator.transform('长孙无忌'); // translatedText = 'zhǎng sūn wú jì'
102
103// 获取音译支持的转换ID列表
104let ids: string[] = i18n.Transliterator.getAvailableIDs(); // ids = ['ASCII-Latin', 'Accents-Any', ...]
105```
106
107
108### 文本标准化
109
110文本标准化是指按指定的范式标准化文本。使用Normalizer类的[normalize](../reference/apis-localization-kit/js-apis-i18n.md#normalize10)接口可以实现文本标准化,具体开发步骤如下:
111
1121. 导入模块。
113   ```ts
114   import { i18n } from '@kit.LocalizationKit';
115   ```
116
1172. 使用文本标准化范式创建标准化对象。文本标准化的范式包括NFC、NFD、NFKC和NFKD,范式的详细介绍请参考[国际标准](https://www.unicode.org/reports/tr15/#Norm_Forms)118   ```ts
119   let normalizer: i18n.Normalizer = i18n.Normalizer.getInstance(mode: NormalizerMode);
120   ```
121
1223. 文本标准化。
123   ```ts
124   let normalizedText: string = normalizer.normalize(text: string); // 对text文本进行标准化处理
125   ```
126
127**开发实例**
128```ts
129// 导入模块
130import { i18n } from '@kit.LocalizationKit';
131
132// 按照NFC范式对文本进行标准化处理
133let normalizer: i18n.Normalizer = i18n.Normalizer.getInstance(i18n.NormalizerMode.NFC);
134let normalizedText: string = normalizer.normalize('\u1E9B\u0323'); // normalizedText = 'ẛ̣'
135```
136
137
138### 获取文本的可换行点
139
140使用[BreakIterator](../reference/apis-localization-kit/js-apis-i18n.md#breakiterator8)类的接口可以根据设定的区域获取文本的可换行点,具体开发步骤如下:
141
1421. 导入模块。
143   ```ts
144   import { i18n } from '@kit.LocalizationKit';
145   ```
146
1472. 创建获取文本可换行点的对象。传入合法的区域ID,创建BreakIterator类型的对象,该对象将按照指定区域的规则计算文本中的可换行点的位置。
148
149   ```ts
150   let iterator: i18n.BreakIterator = i18n.getLineInstance(locale: string);
151   ```
152
1533. 设置要处理的文本。
154   ```ts
155   iterator.setLineBreakText(text: string); // 设置要处理的文本
156   let breakText: string = iterator.getLineBreakText(); // 查看iterator正在处理的文本
157   ```
158
1594. 获取可换行点的位置。
160   ```ts
161   let currentPos: number = iterator.current(); // 获取换行迭代器在当前所处理文本中的位置
162   let firstPos: number = iterator.first(); // 设置为第一个可换行点,返回该可换行点的位置。第一个可换行点总是在文本的起始位置,firstPos = 0
163   let nextPos: number = iterator.next(index?: number); // 将换行迭代器移动index数量个可换行点,index为正数代表向后移动,index为负数代表向前移动,默认值为1。nextPos为移动后在文本中的位置,如果超出文本的长度范围,返回-1
164   let isBoundary: boolean = iterator.isBoundary(offset: number); // 判断offset位置是否是可换行点
165   ```
166
167
168**开发实例**
169```ts
170// 导入模块
171import { i18n } from '@kit.LocalizationKit';
172
173// 创建获取文本可换行点的对象
174let iterator: i18n.BreakIterator  = i18n.getLineInstance('en-GB');
175
176// 设置处理文本
177iterator.setLineBreakText('Apple is my favorite fruit.');
178
179// 将换行迭代器移动到文本起始位置
180let firstPos: number = iterator.first(); // firstPos = 0
181
182// 将换行迭代器向后移动2个可换行点
183let nextPos: number = iterator.next(2); // nextPos = 9
184
185// 判断某个位置是否是可换行点
186let isBoundary: boolean = iterator.isBoundary(9); // isBoundary = true
187
188// 获取BreakIterator对象处理的文本
189let breakText: string = iterator.getLineBreakText(); // breakText = 'Apple is my favorite fruit.'
190```
191
192### 文件路径镜像处理
193
194文件路径镜像处理是指传入镜像语言时,对文件路径字符串进行本地化处理,实现镜像语言下文件路径的镜像显示效果。使用I18NUtil类的[getUnicodeWrappedFilePath](../reference/apis-localization-kit/js-apis-i18n.md#getunicodewrappedfilepath20)接口可以实现文件路径镜像处理,具体开发步骤如下:
195
1961. 导入模块。
197   ```ts
198   import { i18n } from '@kit.LocalizationKit';
199   ```
200
2012. 文件路径镜像处理。
202   ```ts
203   let mirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path: string, delimiter?: string, locale?: Intl.Locale);
204   ```
205
206
207**开发实例**
208```ts
209// 导入模块
210import { i18n } from '@kit.LocalizationKit';
211
212try {
213  // 传入镜像语言,对路径进行镜像处理
214  let path: string = 'data/out/tmp';
215  let delimiter: string = '/';
216  let locale: Intl.Locale = new Intl.Locale('ar');
217  // mirrorPath = 'tmp/out/data/'
218  let mirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path, delimiter, locale);
219
220  // 传入非镜像语言,不处理路径
221  let localeZh: Intl.Locale = new Intl.Locale('zh');
222  // unMirrorPath = '/data/out/tmp'
223  let unMirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path, delimiter, localeZh);
224} catch (error) {
225  console.error(`call I18NUtil.getUnicodeWrappedFilePath failed, error code: ${error.code}, message: ${error.message}.`);
226}
227```
228<!--RP1--><!--RP1End-->