• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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. 以一般类别值为例,获取字符类型。
29
30   ```ts
31   let unicodeType: string = i18n.Unicode.getType(char: string);
32   ```
33
34**开发实例**
35```ts
36// 导入模块
37import { i18n } from '@kit.LocalizationKit';
38
39// 判断字符是否是数字
40let isDigit: boolean = i18n.Unicode.isDigit('1'); // isDigit = true
41
42// 判断字符是否是从右到左语言的字符
43let isRTL: boolean = i18n.Unicode.isRTL('a'); // isRTL = false
44
45// 判断字符是否是表意文字
46let isIdeograph: boolean = i18n.Unicode.isIdeograph('华'); // isIdeograph = true
47
48// 获取字符的一般类别值
49let unicodeType: string = i18n.Unicode.getType('a'); // unicodeType = '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. 获取音译支持的转换ID列表并创建Transliterator对象。
66   ```ts
67   let ids: string[] = i18n.Transliterator.getAvailableIDs(); // 获取音译支持的转换ID列表
68   let transliterator: i18n.Transliterator = i18n.Transliterator.getInstance(id: string); // 传入音译支持的转换ID,创建Transliterator对象
69   ```
70
713. 音译文本。
72   ```ts
73   let translatedText: 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 = i18n.Transliterator.getInstance('Any-Latn');
84let text: string = '中国';
85let translatedText: string = transliterator.transform(text); // translatedText = 'zhōng guó'
86
87// 汉语音译去声调
88let toneLessTransliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Any-Latn;Latin-Ascii');
89translatedText = toneLessTransliterator.transform('中国'); // translatedText = 'zhong guo'
90
91// 汉语姓氏读音
92let nameTransliterator: i18n.Transliterator = i18n.Transliterator.getInstance('Han-Latin/Names');
93translatedText = nameTransliterator.transform('单老师'); // translatedText = 'shàn lǎo shī'
94translatedText = nameTransliterator.transform('长孙无忌'); // translatedText = 'zhǎng sūn wú jì'
95
96// 获取音译支持的转换ID列表
97let ids: string[] = i18n.Transliterator.getAvailableIDs(); // ids = ['ASCII-Latin', 'Accents-Any', ...]
98```
99
100
101### 文本标准化
102
103文本标准化是指按指定的范式标准化文本。使用Normalizer类的[normalize](../reference/apis-localization-kit/js-apis-i18n.md#normalize10)接口可以实现文本标准化,具体开发步骤如下:
104
1051. 导入模块。
106   ```ts
107   import { i18n } from '@kit.LocalizationKit';
108   ```
109
1102. 使用文本标准化范式创建标准化对象。文本标准化的范式包括NFC、NFD、NFKC和NFKD,范式的详细介绍请参考[国际标准](https://www.unicode.org/reports/tr15/#Norm_Forms)111   ```ts
112   let normalizer: i18n.Normalizer = i18n.Normalizer.getInstance(mode: NormalizerMode);
113   ```
114
1153. 文本标准化。
116   ```ts
117   let normalizedText: string = normalizer.normalize(text: string); // 对text文本进行标准化处理
118   ```
119
120**开发实例**
121```ts
122// 导入模块
123import { i18n } from '@kit.LocalizationKit';
124
125// 按照NFC范式对文本进行标准化处理
126let normalizer: i18n.Normalizer = i18n.Normalizer.getInstance(i18n.NormalizerMode.NFC);
127let normalizedText: string = normalizer.normalize('\u1E9B\u0323'); // normalizedText = 'ẛ̣'
128```
129
130
131### 获取文本的可换行点
132
133使用[BreakIterator](../reference/apis-localization-kit/js-apis-i18n.md#breakiterator8)类的接口可以根据设定的区域获取文本的可换行点,具体开发步骤如下:
134
1351. 导入模块。
136   ```ts
137   import { i18n } from '@kit.LocalizationKit';
138   ```
139
1402. 创建获取文本可换行点的对象。传入合法的区域ID,创建BreakIterator类型的对象,该对象将按照指定区域的规则计算文本中的可换行点的位置。
141
142   ```ts
143   let iterator: i18n.BreakIterator = i18n.getLineInstance(locale: string);
144   ```
145
1463. 设置要处理的文本。
147   ```ts
148   iterator.setLineBreakText(text: string); // 设置要处理的文本
149   let breakText: string = iterator.getLineBreakText(); // 查看iterator正在处理的文本
150   ```
151
1524. 获取可换行点的位置。
153   ```ts
154   let currentPos: number = iterator.current(); // 获取iterator在当前所处理文本中的位置
155   let firstPos: number = iterator.first(); // 设置为第一个可换行点,返回该可换行点的位置。第一个可换行点总是在文本的起始位置,firstPos = 0
156   let nextPos: number = iterator.next(index?: number); // 将iterator移动index数量个可换行点,index为正数代表向后移动,index为负数代表向前移动,默认值为1。nextPos为移动后在文本中的位置,如果超出文本的长度范围,返回-1
157   let isBoundary: boolean = iterator.isBoundary(offset: number); // 判断offset位置是否是可换行点
158   ```
159
160
161**开发实例**
162```ts
163// 导入模块
164import { i18n } from '@kit.LocalizationKit';
165
166// 创建获取文本可换行点的对象
167let iterator: i18n.BreakIterator  = i18n.getLineInstance('en-GB');
168
169// 设置处理文本
170iterator.setLineBreakText('Apple is my favorite fruit.');
171
172// 将BreakIterator对象移动到文本起始位置
173let firstPos: number = iterator.first(); // firstPos = 0
174
175// 将BreakIterator对象向后移动2个可换行点
176let nextPos: number = iterator.next(2); // nextPos = 9
177
178// 判断某个位置是否是可换行点
179let isBoundary: boolean = iterator.isBoundary(9); // isBoundary = true
180
181// 获取BreakIterator对象处理的文本
182let breakText: string = iterator.getLineBreakText(); // breakText = 'Apple is my favorite fruit.'
183```
184
185### 文件路径镜像处理
186
187文件路径镜像处理是指传入镜像语言时,对文件路径字符串进行本地化处理,实现镜像语言下文件路径的镜像显示效果。使用I18NUtil类的[getUnicodeWrappedFilePath](../reference/apis-localization-kit/js-apis-i18n.md#getunicodewrappedfilepath18)接口可以实现文件路径镜像处理,具体开发步骤如下:
188
1891. 导入模块。
190   ```ts
191   import { i18n, intl } from '@kit.LocalizationKit';
192   ```
193
1942. 文件路径镜像处理。
195   ```ts
196   let mirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path: string, delimiter?: string, locale?: intl.Locale);
197   ```
198
199
200**开发实例**
201```ts
202// 导入模块
203import { BusinessError } from '@kit.BasicServicesKit';
204import { i18n, intl } from '@kit.LocalizationKit';
205
206try {
207  // 传入镜像语言,对路径进行镜像处理
208  let path: string = 'data/out/tmp';
209  let delimiter: string = '/';
210  let locale: intl.Locale = new intl.Locale('ar');
211  // mirrorPath = 'tmp/out/data/'
212  let mirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path, delimiter, locale);
213
214  // 传入非镜像语言,不处理路径
215  let localeZh: intl.Locale = new intl.Locale('zh');
216  // unMirrorPath = '/data/out/tmp'
217  let unMirrorPath: string = i18n.I18NUtil.getUnicodeWrappedFilePath(path, delimiter, localeZh);
218} catch (error) {
219  console.error(`call I18NUtil.getUnicodeWrappedFilePath failed, error code: ${error.code}, message: ${error.message}.`);
220}
221```
222<!--RP1--><!--RP1End-->